crossoverJie / JCSprout

👨‍🎓 Java Core Sprout : basic, concurrent, algorithm
https://crossoverjie.top/JCSprout
MIT License
27.07k stars 7.09k forks source link

关于LRUCache实现一中remove的疑问 #88

Open happy1yu opened 6 years ago

happy1yu commented 6 years ago

在LRUCahce实现一中的remove方法有一个疑问: 首先通过Hash找到Key对应的数组位置,然后将其置为NULL 但是为什么会有一个QUEUE.poll() 方法,remove的Node不一定就是QUEUE的头结点啊

crossoverJie commented 6 years ago

@crackh

你看的是这里的代码吧:

https://github.com/crossoverJie/Java-Interview/blob/049dea531bd962a5ae3285a74592abd5e148396e/src/main/java/com/crossoverjie/actual/LRUAbstractMap.java#L41

这个版本的 LRU 并不完整(这点确实有问题),有些 bug,不过可以看下思路,以及 HashMap 的一个写入、获取流程。

建议你查看:

https://github.com/crossoverJie/Java-Interview/blob/049dea531bd962a5ae3285a74592abd5e148396e/src/main/java/com/crossoverjie/actual/LRUMap.java#L13

这里没有实现 remove 函数,不过也挺简单。

删除时只需要将 cacheMap 内的数据移除,以及从内部的链表移除即可。