Java 基于 LinkedHashMap 实现 LRU 缓存
核心思想
- LRU(最近最少使用)算法最常见的实现方法是使用一个双向链表或类似的数据结构,最近访问的数据会被移动到链表头部,链表尾部的节点就是最久未被访问的数据。
- LRU 算法可以使用双向链表实现,也就是在各个 Node 节点之间增加
prev指针和next指针,以此构成双向链表。将新增或者访问到的节点移动到链表的头部,超出容量时则从链表的尾部删除节点。 - 要满足 O (1) 时间复杂度,可以使用 HaspMap,里面储存的是 key 与链表节点,这样可以快速查找节点,然后将它删除或者移动到链表的头部。
- LRU 的算法核心是哈希链表,本质就是哈希表 + 双向链表的结合体 (HashMap + DoubleLinkedList),时间复杂度是 O (1),底层的数据结构如下图所示:

- 下面这幅动图完美诠释了 HashMap + DoubleLinkedList 的工作原理,其中
key2是最近访问的数据(可以将其移动到双向链表的尾部或者头部)。

扩展阅读
代码实现
1 | public class LRUCache<K, V> extends LinkedHashMap<K, V> { |
程序执行的输出结果:
1 | [1, 2, 3] |
