具体的实现思路以及缓存工作的细节可以参考这篇文章:
Period-1-实现基本的缓存淘汰策略-方案设计-CSDN博客
直接上代码啦,大家也可以看代码里的注释,虽简短但思路清晰:
class LRUCache {
private Map<Integer, Map<Integer, Integer>> map = new HashMap<>();
private LinkedList<Map<Integer, Integer>> queue = new LinkedList<>();
private int capacity;
public LRUCache(int capacity) {
this.capacity = capacity;
}
//1.缓存中有没有,没有返回-1 2.有先移到队首,返回对应值
public int get(int key) {
Map<Integer, Integer> node = map.get(key);
if (node == null) {
return -1;
}
queue.remove(node);
queue.addFirst(node);
//map.put(key, node)
return map.get(key).get(key);
}
//1.之前有的话前移至队首,改变值 2.新节点放到队首 3.检查删除超出节点
public void put(int key, int value) {
Map<Integer, Integer> node = map.get(key);
if (node != null) {
queue.remove(node);
node.put(key, value);
queue.addFirst(node);
} else {
node = new HashMap<>();
node.put(key, value);
queue.addFirst(node);
}
map.put(key, node);
while (queue.size() > capacity) {
Map<Integer, Integer> removeNode = queue.removeLast();
int removeKey = 0;
for (Integer integer : removeNode.keySet()) {
removeKey = integer;
}
map.remove(removeKey);
}
}
}