LRU(Least Recently Used)最近最久未使用。设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。
也就是说:
- 设计一个k-v容器,对一个经常查询的key使其保持最新;
- 当容器满数据时,淘汰容器最老的数据。
了解完大致需求,很快的写出了代码。
public class LRUCache {
public static void main(String[] args) {
//初始LRU容器的大小为2
LRUCache cache = new LRUCache(2 );
cache.put(2, 1);
cache.put(1, 1);
cache.put(2, 3);//作废2=1
cache.put(4, 1);//作废1=1
System.out.println(cache.get(1));//-1
System.out.println(cache.get(2));//3
}
private LinkedHashMap<Integer, Integer> map;
private int capacity;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new LinkedHashMap<>(capacity);
}
public int get(int key) {
//get到某值的时候,把这个k-v删除放到链尾
Integer value = map.get(key);
if (map.get(key) == null) {
value = -1;
} else {
map.put(key, map.remove(key));
}
return value;
}
public void put(int key, int value) {
//链表已经包含整个值,直接put会刷新value,不会变动key的位置
if (map.containsKey(key)) {
map.remove(key);
}
//将k-v放入链尾
map.put(key, value);
//容器将满,删除链头k-v
if (map.size() > capacity) {
Iterator<Integer> iterator = map.keySet().iterator();
Integer next = iterator.next();
map.remove(next);
}
}
}
测试案例中依此放进容器: 2=1,1=1,2=3,4=1
控制台输出
-1
3