我看着这个帖子:LinkedHashMap removeEldestEntry: How many elements are removed?LinkedHashMap removeEldestEntry是否删除2个元素?
它声明removeEldestEntry只删除1个元素。这对我来说很有意义,但是当我通过我的代码进行调试时,它似乎删除了2个元素。我不知道为什么。
public class LRUCache {
LinkedHashMap<Integer, Integer> LRUMap;
public LRUCache(int capacity) {
LRUMap = new LinkedHashMap<Integer, Integer>() {
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return LRUMap.size() > capacity;
}
};
}
public int get(int key) {
if (LRUMap.containsKey(key)) {
int val = LRUMap.remove(key);
LRUMap.put(key, val);
return val;
}
return -1;
}
public void set(int key, int value) {
LRUMap.put(key, value);
}
public static void main(String[] args) {
LRUCache c = new LRUCache(2);
c.set(2,1);
c.set(1,1);
c.set(2,3);
c.set(4,1);
}
}
所以你由此可以看出,它会插入:(2,1)
和(1,1)
。下一个因素是事情变得混乱。因为密钥2已经存在,所以用(2,3)
覆盖(2,1)
元素。在此之后,当我插入(4,1)
时,我已经有2个元素,所以它应该删除最长的条目:(1,1)
。但是,它同时删除了(2,3)
和(1,1)
,使我在地图中只有(4,1)
。
任何想法为什么?我认为这与被替换的关键字有关,并且(2,3)
位于列表的开头,就像它是最年长的条目一样,尽管它不应该是。但我仍然困惑为什么它会删除2个元素。
在附注中,它看起来像是在LinkedHashMap
的前面存储最年长的元素,这也会给我们一个固定的时间删除最老的条目。这是真的?
不,它不会删除'1,1':https://ideone.com/WStVFc –
嗯,你是对的,我的日食现在在调试器中显示相同的东西。以前我的eclipse可能有些bug。非常感谢您为我验证:)。 – Kevin