【发布时间】:2016-05-10 04:22:33
【问题描述】:
我看了这个帖子:LinkedHashMap removeEldestEntry: How many elements are removed?
它声明 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: ideone.com/WStVFc -
嗯,你是对的,我的 Eclipse 现在在调试器中显示了同样的东西。也许我之前的 Eclipse 出了点问题。好的,谢谢您为我验证:)。
标签: java linkedhashmap