LinkedHashMap如何实现LRU缓存?
请解释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不是线程安全的。