import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
class LRUCache {
private final LinkedHashMap<Integer, Integer> data;
private final int capacity;
public LRUCache(int capacity) {
data = new LinkedHashMap<>(capacity);
this.capacity = capacity;
}
public int get(int key) {
// key存在要先移除再重新添加,保持在最后
if (data.containsKey(key)) {
Integer integer = data.get(key);
data.remove(key);
data.put(key, integer);
return integer;
}
return -1;
}
public void put(int key, int value) {
if (data.containsKey(key)) {
data.remove(key);
} else {
// 超出容量移除第一个
if (data.size() == capacity) {
Iterator<Map.Entry<Integer, Integer>> iterator = data.entrySet().iterator();
iterator.next();
iterator.remove();
}
}
data.put(key, value);
}
}
利用 removeEldestEntry
,重写这个方法,put进新值方法返回true时,会移除该map中最老的键和值。
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) {
return size() > capacity;
}
}