#1、lru算法背景 设计实现一个LRU(最近最少缓存)使用机制。它应该支持以下操作获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key), 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 #2、代码实现 ` public class LRUCache {
/**
* 容量
*/
private int cap;
/**
* 定义一个链表
*/
private Map<Integer, Integer> map = new LinkedHashMap<Integer,Integer>();
LinkedList list = new LinkedList<Integer>();
public LRUCache(int capacity){
this.cap = capacity;
}
public int getKey(int key){
//
if (map.keySet().contains(key)){
int value = map.get(key);
//链表删除原有的key放入,最新使用,将其添加到尾部
map.remove(key);
//保证每次查询后,都在末尾
map.put(key,value);
return value;
}
return -1;
}
public void put(int key, int value){
if (map.keySet().contains(key)){
map.remove(key);
}else if (map.size() == cap){
//达到最大长度了,移除头部的节点(最少使用)
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
iterator.next();
iterator.remove();
}
map.put(key,value);
}
`