简单介绍LRU缓存算法:
LRU(Least recently used)即最近最少使用。将数据添加到缓存中,当缓存满了的时候,移除最近最少访问的数据,留出空间存放新添加的数据。
代码:
public class LRUCache {
private int cap; // 容量大小
private LinkedHashMap<Integer, Integer> cache; // 缓存数据结构 [尾部元素:最近被访问]
// 构造函数
public LRUCache(int cap, LinkedHashMap<Integer, Integer> cache){
this.cap = cap;
this.cache = new LinkedHashMap<>();
}
/**
* 取元素
* 思路:判断cache中是否存在键为key的元素
* 不存在,返回-1
* 存在,获取对应的val值,然后通过先删后在尾部添加的方式,替换移动元素在链表中位置的操作(表示它最近刚被访问)
**/
public int get(int key){
if(cache.containsKey(key)){
int val = cache.get(key);
cache.remove(key);
cache.put(key, val);
return val;
}
return -1;
}
/**
* 存元素
* 思路:先判断cache中是否存在key
* 存在,则更新key对应的val。并做先删后添加的操作,保证最近被访问
* 不存在,则先添加新元素到cache中,然后判断添加完后是否超出cache容量,如果超了,则删除头部的节点
**/
public void put(int key, int val){
if(cache.containsKey(key)){
cache.remove(key);
cache.put(key, val);
}else{
cache.put(key, val);
if(cache.size() > cap){
int first = cache.keySet().iterator().next(); // 获取头部节点
cache.remove(first);
}
}
}
}