Java RemoveedStantry是如何实现的,LinkedHashMap中该方法的运行时/复杂性是多少?

Java RemoveedStantry是如何实现的,LinkedHashMap中该方法的运行时/复杂性是多少?,java,runtime,implementation,linkedhashmap,Java,Runtime,Implementation,Linkedhashmap,所以我环顾了一下,并没有找到任何直接的答案。就我个人而言,我猜Java可能会在插入LinkedHashMap的项目上操纵时间戳,并可能以某种方式在其排序中使用时间戳 我知道RemoveedSterntry需要做的只是返回true/false,但是当它真正从映射中删除最老的条目时,运行时似乎是O(n),它到底是什么 谢谢。来自 如果跟踪插入的最旧密钥,则删除将为O(1),否则为O(n) 您还可以利用键插入顺序。请记住,即使LinkedHashMap是根据插入密钥的时间排序的,但如果重新插入密钥,则

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

我知道RemoveedSterntry需要做的只是返回true/false,但是当它真正从映射中删除最老的条目时,运行时似乎是O(n),它到底是什么

谢谢。

来自

如果跟踪插入的最旧密钥,则删除将为O(1),否则为O(n)


您还可以利用键插入顺序。请记住,即使LinkedHashMap是根据插入密钥的时间排序的,但如果重新插入密钥,则不会更改顺序(这可能会使该密钥作为最长的密钥无效)

Java什么都不做。该方法的JDK实现是:

返回false

对于希望在自己的子类中自定义map行为的人来说,它是一个扩展点

如果将其更改为返回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;
    }
//如果有指示,请删除最老的条目,否则在适当的情况下增加容量
条目最长=页眉.after;
如果(最年长者){
//这是标准的HashMap移除,然后通过
//对已删除的条目调用Map.Entry#remove()。
RemoveEntryWorkey(最年长的钥匙);
}
私有静态类条目扩展了HashMap.Entry{
//这些字段包括用于迭代的双链接列表。
入境前、入境后;
/**
*从链接列表中删除此条目。
*/
私有无效删除(){
before.after=之后;
before=before;
}

哦,我明白了!当你说“它所做的一切就是移除头部”时,我有点吃惊!现在我明白了为什么他们还在Hashmap上使用双重链接列表。如果访问了有限数量的项目中的某些内容,他们所要做的就是更新指针并将其移动到前面。现在一切都有意义了。谢谢大家!