自己实现LRU
2020-01-03 本文已影响0人
废柴傻狗
LRU特点
规定:链表元素越靠前,表明越旧没有使用了。
- put的元素是全新的,则添加到链表最后。
- put的元素是已有的,将其更新到链表最后。
- 如果put时链表已达容量上限,则淘汰最近最久未使用的元素(头节点)。
LinkedHashMap可以轻松实现LRU
LinkedHashMap 底层由双向链表和哈希表组成,而且自带removeEldestEntry方法实现淘汰最近最久未使用元素的方法,但需要重写。
因此我们实现一个LRUMap类继承LinkedHashMap。
注意构造函数里的acessOrder要为true,实现顺序访问,这样最近最久未使用的元素会放在头节点上。
public class Main {
public static class LRUMap<K, V> extends LinkedHashMap<K, V> {
private int cacheSize;
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
// 如果超过容量则丢弃最久未使用的元素
if (cacheSize + 1 == this.size()) {
return true;
} else {
return false;
}
}
/**
* 构造函数,调用父类构造方法
* @param n LRU最大容量
*/
public LRUMap(int n) {
super(16,0.75f,true);
this.cacheSize = n;
}
public String toString() {
String s = "";
for (Map.Entry e : this.entrySet()) {
s += e.getValue() + " ";
}
return s;
}
}
public static void main(String[] args) {
LRUMap<Integer, String> map = new LRUMap<Integer, String>(3);
// 淘汰2
map.put(1, "1");
map.put(2, "2");
map.put(1, "1");
map.put(3, "3");
map.put(4, "4");
System.out.println(map.toString());
}
}