一、先回答:为啥这么简单?

因为 LinkedHashMap 底层天生自带 LRU 能力,Java 官方已经帮你写好了:

  1. LinkedHashMap 内部 = HashMap + 双向链表
  2. 它有一个开关:accessOrder
  3. 开关一开,自动实现:
    • 访问 get、修改 put → 自动把节点挪到链表头部
    • 最久没用到的元素,自动留在链表尾部

你写的代码,只是复用 JDK 自带轮子,只需要补两行规则:

  • 限制最大容量
  • 超容量就删最旧的

二、逐行拆解你这段代码

1. 继承 LinkedHashMap

class LRUCacheSimple extends LinkedHashMap<Integer, Integer>

LinkedHashMap 本来就:

  • 存键值对(HashMap)
  • 用双向链表维护访问顺序 / 插入顺序

2. 构造方法关键参数

super(capacity, 0.75f, true);

三个参数含义:

  1. 初始容量:capacity
  2. 负载因子:0.75f(HashMap 默认,不用改)
  3. 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 对比

  1. 你这个 LinkedHashMap 版本

    • 优点:代码极少、面试写得快、不出 bug
    • 场景:笔试、速成、项目快速开发
    • 底层:JDK 封装好的双向链表 + 哈希
  2. 手写双向链表 + HashMap 版本

    • 优点:纯手撕,展示底层理解
    • 场景:大厂深度面试(问你底层怎么实现)
    • 缺点:代码多,容易写错指针

四、一句话总结背诵

  1. LinkedHashMap 底层自带 HashMap + 双向链表
  2. 构造器第三个参数 accessOrder=true 开启 LRU 访问排序
  3. 重写 removeEldestEntry,判断容量超限自动删最久未使用
  4. 所以代码极简,是 Java 最快写出来的标准 LRU
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐