java – 在LinkedHashMap中使用双链接列表而不是单个LinkedList

我知道我的问题与之前发布的问题非常相似.我已经通过了多个帖子,但仍然不太清楚答案.这就是为什么我再次发布它.

Why Linked HashMap uses doubly LinkedList over Single LinkedList while order can also be maintained through Single LinkedList.

在上一篇文章的回答中,提到LinkedHashMap为删除提供了O(1)复杂性,因为它有前一个和下一个元素指针,但我认为HashMap也提供O(1)删除.

谢谢,

解决方法:

i think HashMap also provides O(1) for deletion

这是真的,但HashMap不必维护键的顺序.因此,在删除条目时,它只需要修改从中删除条目的存储桶的小链表(在Java 8之前的实现中.Java 8实现使用树),这应该采用预期的O(1)时间.

另一方面,LinkedHashMap必须维护将键添加到Map的顺序,它使用包含Map的所有条目的附加链接列表.因此,当您删除条目时,如果您无权访问此大链接列表中的上一个条目,则必须从其开头迭代链接列表,直到找到它为止,这将需要线性时间.

您可以在此处删除条目后查看LinkedHashMap的功能:

void afterNodeRemoval(Node<K,V> e) { // unlink
    LinkedHashMap.Entry<K,V> p =
        (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
    p.before = p.after = null;
    if (b == null)
        head = a;
    else
        b.after = a;
    if (a == null)
        tail = b;
    else
        a.before = b;
}

使用单链表不能在恒定时间内完成.

上一篇:java – 使用LinkedHashMap.putAll()插入元素的顺序是什么?


下一篇:Java LinkedHashMap:这两者有什么区别?