LinkedHashMap 底层天生自带 LRU 能力,几十行就是标准 LRU,不用自己写链表、HashMap。
·
一、先回答:为啥这么简单?
因为 LinkedHashMap 底层天生自带 LRU 能力,Java 官方已经帮你写好了:
LinkedHashMap内部 =HashMap + 双向链表- 它有一个开关:
accessOrder - 开关一开,自动实现:
- 访问
get、修改put→ 自动把节点挪到链表头部 - 最久没用到的元素,自动留在链表尾部
- 访问
你写的代码,只是复用 JDK 自带轮子,只需要补两行规则:
- 限制最大容量
- 超容量就删最旧的
二、逐行拆解你这段代码
1. 继承 LinkedHashMap
class LRUCacheSimple extends LinkedHashMap<Integer, Integer>
LinkedHashMap 本来就:
- 存键值对(HashMap)
- 用双向链表维护访问顺序 / 插入顺序
2. 构造方法关键参数
super(capacity, 0.75f, true);
三个参数含义:
- 初始容量:
capacity - 负载因子:
0.75f(HashMap 默认,不用改) - accessOrder = true 【核心】
false(默认):按插入顺序排序true:按访问顺序排序 ✅ LRU 关键
👉 只要这个参数为 true:只要你 get/put 某个 key,它就自动移到链表末尾(最新使用)长期不访问的,会留在最前面(最久未使用)
3. get 方法
public int get(int key) {
return super.getOrDefault(key, -1);
}
- 调用父类
get - 一旦触发 get,LinkedHashMap 自动把这个 key 标记为最近使用
- 不存在返回 -1,符合 LeetCode LRU 题意
4. put 方法
public void put(int key, int value) {
super.put(key, value);
}
- key 存在:覆盖 value + 自动刷新访问顺序
- key 不存在:新增元素
5. 重写这个方法 = 淘汰规则(最关键)
@Override
protected boolean removeEldestEntry(Entry<Integer, Integer> eldest) {
return size() > capacity;
}
- 这是
LinkedHashMap提供的钩子方法 - 每次 put 新增元素后,自动触发
- 返回
true就会:自动删掉最久未使用的 eldest 节点
逻辑:
- 当元素数量 > 设定容量 → 删掉最旧数据
- 完美实现 LRU 淘汰
三、两种 LRU 对比
-
你这个 LinkedHashMap 版本
- 优点:代码极少、面试写得快、不出 bug
- 场景:笔试、速成、项目快速开发
- 底层:JDK 封装好的双向链表 + 哈希
-
手写双向链表 + HashMap 版本
- 优点:纯手撕,展示底层理解
- 场景:大厂深度面试(问你底层怎么实现)
- 缺点:代码多,容易写错指针
四、一句话总结背诵
LinkedHashMap底层自带 HashMap + 双向链表- 构造器第三个参数
accessOrder=true开启 LRU 访问排序 - 重写
removeEldestEntry,判断容量超限自动删最久未使用 - 所以代码极简,是 Java 最快写出来的标准 LRU
更多推荐




所有评论(0)