Java 在单LinkedList上的LinkedHashMap中使用双链表

Java 在单LinkedList上的LinkedHashMap中使用双链表,java,linkedhashmap,Java,Linkedhashmap,我知道我的问题和之前发布的问题非常相似。我已经为这个问题浏览了多篇帖子,但仍然不太清楚答案。这就是我再次发布的原因 为什么链接HashMap使用双链接列表而不是单链接列表,而顺序也可以通过单链接列表来维护 在前一篇文章的回答中提到,LinkedHashMap为删除提供了O(1)复杂性,因为它有上一个和下一个元素指针,但我认为HashMap也为删除提供了O(1) 谢谢 我认为HashMap还提供了O(1)来进行删除 没错,但是HashMap不必维护键的顺序。因此,当删除条目时,它只需修改从中删除条

我知道我的问题和之前发布的问题非常相似。我已经为这个问题浏览了多篇帖子,但仍然不太清楚答案。这就是我再次发布的原因

为什么链接HashMap使用双链接列表而不是单链接列表,而顺序也可以通过单链接列表来维护

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

谢谢

我认为HashMap还提供了O(1)来进行删除

没错,但是HashMap不必维护键的顺序。因此,当删除条目时,它只需修改从中删除条目的bucket的小链表(在Java 8之前的实现中,Java 8实现使用树),这需要预期的
O(1)
时间

另一方面,
LinkedHashMap
必须保持键添加到地图的顺序,这是通过包含地图所有条目的附加链接列表实现的。因此,当您删除一个条目时,如果您无法访问这个大链表中的前一个条目,那么您必须从链表的开始遍历链表,直到找到它为止,这将需要线性时间

删除此处的条目后,您可以查看
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;
}
void afterNodeRemoval(节点e){//unlink
LinkedHashMap.Entry p=
(LinkedHashMap.Entry)e,b=p.before,a=p.after;
p、 before=p.after=null;
如果(b==null)
水头=a;
其他的
b、 之后=a;
如果(a==null)
尾=b;
其他的
a、 前=b;
}

这不能用单个链表在固定时间内完成。

我在LinkedHashMap类源代码中找不到此方法。@Manish您检查了哪个Java版本?我在Java 8Ok中找到了它,我正在检查Java 6。@Manish应该有与Java等价的东西6@Manish看见