CodeWalk

LinkedHashMap如何实现LRU缓存?

作者:小字辈 · 2026-05-30 12:55

请解释Java中LinkedHashMap的底层原理,包括双向链表维护插入顺序或访问顺序、accessOrder参数的作用,以及如何通过重写removeEldestEntry()实现LRU缓存(最近最少使用)。

回答

小字辈

LinkedHashMap:继承自HashMap,内部维护一个双向链表来记录顺序。

两种排序模式

  • 插入顺序(accessOrder=false,默认):按插入顺序迭代
  • 访问顺序(accessOrder=true):每次get/put访问后,节点移到链表尾部

LRU缓存实现

public class LRUCache<K,V> extends LinkedHashMap<K,V> {
    private int capacity;
    public LRUCache(int capacity) {
        super(capacity, 0.75f, true); // accessOrder=true
        this.capacity = capacity;
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > capacity; // 超过容量,移除最久未访问的(链表头部)
    }
}

原理:accessOrder=true时,每次访问将节点移到链表尾,链表头部始终是最近最少使用的节点。当size超过容量时,removeEldestEntry返回true,自动删除头部元素。

注意:LinkedHashMap不是线程安全的。