所以我看了一下,实在找不到任何直接答案。就个人而言,我猜Java可能会操纵插入到LinkedHashMap中的项目的时间戳,并可能以某种方式在其排序中使用它。
我知道removeEldestEntry需要做的只是返回true / false,但是当它实际上从地图中删除最旧的条目时,看起来运行时将是O(n),它是什么真的?
感谢。
答案 0 :(得分:2)
Java什么都不做。该方法的JDK实现是:
return false;
对于想要在自己的子类中自定义地图行为的人来说,它是一个扩展点。
如果将其更改为true,则运行时仍为O(1)。该列表按插入顺序维护。它所做的就是移除头部,不需要任何迭代。只需删除标准HashMap,然后重新分配两个指针。
// Remove eldest entry if instructed, else grow capacity if appropriate
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {
//This is the standard HashMap remove, which then finishes by
//calling Map.Entry#remove() on the removed entry.
removeEntryForKey(eldest.key);
}
private static class Entry<K,V> extends HashMap.Entry<K,V> {
// These fields comprise the doubly linked list used for iteration.
Entry<K,V> before, after;
/**
* Removes this entry from the linked list.
*/
private void remove() {
before.after = after;
after.before = before;
}
答案 1 :(得分:0)
来自http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html
如果您跟踪插入的最旧密钥,则删除将为O(1),否则为O(n)。
您也可以利用密钥插入顺序。请记住,即使LinkedHashMap是根据插入密钥的时间进行排序的,但如果重新插入密钥(这可能会使该密钥无效,则可能会使该密钥失效)也不会更改顺序。