面试题 16.25. LRU 缓存
方法一:HashMap+LinkedList
public class LRUCache {
HashMap<Integer, Integer> map;
LinkedList<Integer> list;
int capacity;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<>();
list = new LinkedList<>();
}
public int get(int key) {
if (map.containsKey(key)) {
list.remove((Integer)key);
list.addLast(key);
return map.get(key);
}
return -1;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
list.remove((Integer) key);
list.addLast(key);
map.put(key, value);
return;
}
if (list.size() == capacity) {
int firstElement = list.getFirst();
list.removeFirst();
list.addLast(key);
map.remove(firstElement);
map.put(key, value);
}
else{
list.addLast(key);
map.put(key, value);
}
}
}
方法二:LinkedHashMap,其结构为链表+map
public class LRUCache extends LinkedHashMap<Integer, Integer> {
private int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
//当map长度超出预定长度时,删除最老的键和值
return size() > capacity;
}
}