LRU java 实现方式
文章目录
-
-
- **方式 1:直接使用 `LinkedHashMap`(简洁版)**
- **方式 2:手动实现哈希表 + 双向链表(底层原理版)**
-
- **步骤 1:定义双向链表节点**
- **步骤 2:构建 LRU 缓存结构**
- **性能对比**
- **扩展:线程安全 LRU 缓存**
- **总结**
-
在 Java 中实现 LRU(Least Recently Used)缓存淘汰算法,核心是通过 哈希表(快速访问) 和 双向链表(维护访问顺序) 的组合,保证
O(1)
时间复杂度的
get
和
put
操作。以下是两种典型实现方式:
方式 1:直接使用 LinkedHashMap
(简洁版)
LinkedHashMap
内部已维护了插入顺序或访问顺序的双向链表,通过重写 removeEldestEntry
方法即可快速实现 LRU。
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
// accessOrder=true: 按访问顺序排序(最近访问的放链表尾部)
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
// 当容量超过阈值时,自动删除最旧(链表头部)的条目
return size() > capacity;
}
public static void main(String[] args) {
LRUCache<Integer, String> cache = new LRUCache<>(2);
cache.put(1, "A");
cache.put(2, "B");
cache.get(1); // 访问键1,使其成为最近使用
cache.put(3, "C"); // 触发淘汰,键2被移除
System.out.println(cache); // 输出: {1=A, 3=C}
}
}
方式 2:手动实现哈希表 + 双向链表(底层原理版)
更底层地模拟 LRU 机制,适合需要深度定制或理解原理的场景。