LRU缓存
维护固定大小的内存,如果新增数据时,内存满了,则删除最长时间没有用到的数据。并且get和put都必须O(1),通常采用HashMap来实现访问get的O(1)效率,采用双向链表实现插入put的O(1)效率,并且双向链表从队尾插入,则队头数据是最长时间没有访问到的,保证了有序性。
在用java实现的过程中使用LinkedHashMap结构来,避免手动构建双向链表+HashMap。
LinkedHashMap中keySet().iterator().next()返回有序的key值中最开始那个(也就是最久没有用到的key)。
class LRUCache {
LinkedHashMap<Integer,Integer> cache;
int capacity;
public LRUCache(int capacity) {
cache = new LinkedHashMap<>(capacity);
this.capacity = capacity;
}
public int get(int key) {
if(!cache.containsKey(key))return -1;
int value = cache.get(key);
//这里需要删除后重新插入,因为刚刚分为过这个key,应该放在双链表末尾
cache.remove(key);
cache.put(key,value);
return value;
}
public void put(int key, int value) {
if(cache.containsKey(key)){
//如果包含,则删除原有key,重新插入(key,value)
cache.remove(key);
cache.put(key,value);
return;
}
//如果不包含,则在插入前需要判断是否达到内存容量
if(capacity==cache.size()){
//获得最久没有使用的key
int old = cache.keySet().iterator