前两天网易面试被问到的问题, 当时我根本不知道什么是LRU…很尴尬
LRU Cache = Least Recently Uesd Cache
就是: 最近 最少使用的缓存;
当时在面试官的提示下我第一个想到的是HashMap, 要做线程安全可以用ConcurrentHashMap
然后面试官提示缓存不能无限大, 所以我限定了HashMap的容量, 但是因为不理解LRU的概念, 所以答得很惨烈…
这个题目很典型, 出自Leetcode: 146. LRU缓存机制 题目链接
题目描述如下:
这一题我的第一反应是, LRU可能应该用一个HashMap配合一个Queue来做, 因为它要做一个类似于先进先出的模式呀, 最早使用的在前面, 要先出去, 但是很容易要出现的情况是, 一个原本在队列中间的元素, 现在要使用了, 就很难从队列里取出来;
所以这题的正解是 使用HashMap加链表来做, 在HashMap里, 存一个key-value的结构, 然后value里面就存链表每个节点的引用, 限定Map和链表的长度, 保证不会超过Capacity;
图解如上;
实现代码如下:
public class LRUCache {
private Map<Integer, Integer> cache;
public LRUCache(int capacity) {
this.cache = new LinkedHashMap<Integer, Integer>(capacity, 0.75f, true){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return capacity < cache.size();
}
};
}
public int get(int key) {
return cache.getOrDefault(key, -1);
}
public void put(int key, int value) {
cache.put(key, value);
}
}