题目
LRU
思路
LRU 大家都不陌生,操作系统的作业做过,思路就是一旦添加或者访问某个元素,则将其的“访问属性”置零,而其他元素的访问属性统统减一,这样一来,访问属性最小的元素就是最久没访问过的。
但是,我看了下题解,似乎有个java类可以完美实现LRU 就是linkHashMap
收获
LinkedHashMap的构造函数:cache = new LinkedHashMap<>(capacity,0.75f,true);LinkedHashMap的三个构造函数分别是初始容量,扩容因子和是否移除旧的元素
若要实现移除旧元素则需要重写其函数:
protected boolean removeEldestEntry(Map.Entry eldest) {
if(this.size() > capacity){
return true;
}
return false;
}
代码
class LRUCache {
Map<Integer,Integer> cache = null;
// 这个是匿名内部类
// LinkedHashMap的三个构造函数分别是初始容量,扩容因子和是否移除旧的元素
public LRUCache(int capacity) {
cache = new LinkedHashMap<>(capacity,0.75f,true){
// 必须覆盖该方法来保证移除旧的元素
// 返回false,不删除
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
if(this.size() > capacity){
return true;
}
return false;
}
};
}
public int get(int key) {
Integer v = this.cache.get(key);
return v==null?-1:v.intValue();
}
public void put(int key, int value) {
this.cache.put(key,value);
}
}