如何实现removeEldestEntry以及LinkedHashMap中方法的运行时/复杂性是什么?

时间:2013-11-08 20:47:04

标签: java runtime implementation linkedhashmap

所以我看了一下,实在找不到任何直接答案。就个人而言,我猜Java可能会操纵插入到LinkedHashMap中的项目的时间戳,并可能以某种方式在其排序中使用它。

我知道removeEldestEntry需要做的只是返回true / false,但是当它实际上从地图中删除最旧的条目时,看起来运行时将是O(n),它是什么真的?

感谢。

2 个答案:

答案 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是根据插入密钥的时间进行排序的,但如果重新插入密钥(这可能会使该密钥无效,则可能会使该密钥失效)也不会更改顺序。