一、什么是LRU?
LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。
如图所示:
-
先来3个元素进入该队列
-
此时来了新的元素,因为此时队列中每个元素的使用的次数都相同(都是1),所以会按照LFU的策略淘汰(即淘汰掉最老的那个)
-
此时又来了新的元素,而且是队列是已经存在的,就会将该元素调整为最新的位置。
-
如果此时又来了新的元素,还是”咯咯“,由于”咯咯“已经处于最新的位置,所以大家位置都不变。
-
同理,一直进行上述的循环
二、LinkedHashMap 实现LRU缓存
以力扣的算法题为例子:
在 jdk 官方的介绍中可以看出,该数据结构天生适合实现 LRU。
代码示例一:
/**
* 利用继承 LinkedHashMap 的方式实现LRU缓存
*/
class LRUCache extends LinkedHashMap<Integer, Integer> {
// 缓存容量
private int capacity;
public LRUCache(int capacity) {
// 初始化
super(capacity, 0.75f, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
// 重写比较方法
return super.size() > capacity;
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
代码示例二:
/**
* 利用 LinkedHashMap 特点的方式实现LRU缓存
*/
class LRUCache {
// 额定容量
private final int CAPACITY;
// 使用 LinkedHashMap 的有序排重特点达到要求
private final