lru缓存用linkedlist+hashmap实现的核心是:链表尾部存最新访问项、头部存最久未用项,get/put时同步更新链表顺序与哈希表,确保查o(1)、调序o(1);而linkedhashmap设accessorder=true并重写removeeldestentry()是更优内置方案。

Java 中用 LinkedList 实现 LRU 缓存淘汰算法,核心在于利用链表维护访问顺序,配合哈希表实现快速查找。虽然 LinkedList 本身不是最优解(因查找是 O(n)),但它结构清晰、易于理解,适合教学或轻量场景。
用 LinkedList + HashMap 组合模拟访问顺序
单独用 LinkedList 存键(如 LinkedList<k></k>)记录访问序列,再用 HashMap<k v></k> 存真实数据。每次操作都同步更新两者:
- get(key):若存在,先从链表中移除该 key,再添加到末尾(表示“最新使用”);返回 map 中对应 value
- put(key, value):若已存在,同样先移 key 再加尾;若不存在且容量满,删链表首元素(最久未用),再从 map 中移除对应项,最后插入新 key-value 对,并将 key 加入链表尾
注意链表头尾语义别搞反
常见误区是把“头部”当成最新——实际应统一约定:链表尾部为最近访问,头部为最久未用。这样删最久未用项时调用 removeFirst(),加新项或更新项时调用 addLast(key),逻辑更自然。例如:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
为什么不用纯 LinkedList 存值?
LinkedList<node></node> 虽可封装 key-value,但查找 key 仍需遍历,get() 和 contains() 都是 O(n);而搭配 HashMap 后,查 key 变成 O(1),仅链表调整为 O(1)(remove+addLast),整体效率可控。不推荐只靠 LinkedList 自身的 indexOf 或 contains 判断——它们内部就是遍历。
对比 LinkedHashMap 是更优选择
如果追求简洁与性能,直接用 LinkedHashMap 并设置 accessOrder = true,重写 removeEldestEntry() 即可自动实现 LRU。它底层就是双向链表+哈希表,行为完全符合要求,且线程不安全但开销极低。手写 LinkedList 方案主要用于理解机制或面试推演。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










