一、LinkedHashMap
LinkedHashMap 内部维护了一个双向链表,用来维护插入顺序或者 LRU(最近最久未使用)顺序。
其中有一个属性——accessOrder,当一个节点被访问时,如果 accessOrder 为 true,则会将该节点移到链表尾部。也就是说指定为 LRU 顺序之后,在每次访问一个节点时,会将这个节点移到链表尾部,保证链表尾部是最近访问的节点,那么链表首部就是最近最久未使用的节点。
在 put 等操作之后执行,当 removeEldestEntry()方法返回 true 时(即 size > threshold)会移除最晚的结点,即链表的首部结点。
以下是使用 LinkedHashMap 实现的一个 LRU 缓存:
- 设定最大缓存空间 threshold 为4;
- 使用 LinkedHashMap 的构造函数将 accessOrder 设置为 true,开 LRU 顺序;
- 覆盖 removeEldestEntry()方法实现,在结点多于 threshold 时就会将最近最久未使用的数据移除。
public class LRU<K, V> extends LinkedHashMap<K, V> {
private int initialSize;
public LRU(int initialSize) {
super(initialSize, 0.75f, true);
this.initialSize = initialSize;
}
@Override
protected boolean removeEldestE