使用LinkedHashmap(HashMap的子类,能够记住插入数据的顺序).
LRU是Lease Recently User的缩写,意思是最近 最少使用。比如设计一个文件缓存系统,每个文件有自己的大小和访问时间,文件缓存系统有总的大小,当往这个文件系统中放入新的文件时,如果发现超出文件缓存系统的容量,那么把访问时间最旧的文件删掉。
LRU实现代码如下
java
lass LRUCache {
int cap;
LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
private void makeRecently(int key){
int val = cache.get(key);//删除key,重新插入到队尾
cache.remove(key);
cache.put(key, val);// 删除 key,重新插入到队尾
}
public LRUCache(int capacity) {//初始化 LRU 缓存
this.cap = capacity;
}
public int get(int key) {// 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
if(!cache.containsKey(key)){
return -1;
}
makeRecently(key);//将key设置为最近使用
return cache.get(key);
}
public void put(int key, int val) {//如果关键字 key 已经存在,则变更其数据值 value ;
if(cache.containsKey(key)){
cache.put(key, val);// 修改 key 的值
makeRecently(key);// 将 key 变为最近使用
return;
}
if(cache.size() >= this.cap){
int oldestKey = cache.keySet().iterator().next();//链表头部就是最久未使用的key
cache.remove(oldestKey);
}
cache.put(key,val);//将新的key添加到链表尾部
}
}