Java中可用LinkedHashMap的accessOrder=true特性配合重写removeEldestEntry()实现LRU缓存,每次get/put将节点移至尾部,头部为最久未用项;容量超限时自动删除头部元素;需额外处理线程安全,如用synchronizedMap包装或ReentrantLock保护。

Java 中可以用 LinkedHashMap 的访问顺序(accessOrder = true)特性,配合重写 removeEldestEntry() 方法,轻松实现 LRU 缓存,无需手动维护访问链表。
启用访问顺序模式
LinkedHashMap 默认按插入顺序排列,但构造时传入 true 可切换为访问顺序:每次 get() 或 put() 都会把对应节点移到链表尾部,最久未使用的自然留在头部。
创建方式如下:
new LinkedHashMap<K, V>(initialCapacity, loadFactor, true)
重写 removeEldestEntry 控制容量
该方法在每次 put() 后被调用,返回 true 时会自动删除最老的条目(即链表头部)。只需根据缓存大小限制返回判断逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 例如最大容量为
capacity,当当前 size > capacity 时返回true - 注意:不能在
get()中手动删除,否则破坏线程安全和封装性
线程安全需额外处理
LinkedHashMap 本身非线程安全。若多线程使用,有几种常见做法:
- 用
Collections.synchronizedMap()包装(简单但全局锁,性能一般) - 用
ConcurrentHashMap+ 手动 LRU 逻辑(更复杂,但可细粒度控制) - 在读写频繁场景下,推荐加读写锁或使用
ReentrantLock保护关键操作
完整示例代码
一个线程安全、固定容量的 LRU 缓存实现:
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
// accessOrder = true
super(16, 0.75f, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
使用时直接 new 实例,put() 和 get() 即自动满足 LRU 行为。

















