问题 为什么linkedhashmap维护迭代的双向链表


因为在任何线程中都没有内部和合理的解释。 请给我确切的理由。

  1. 对于插入顺序,它足以维持单链表,但为什么不呢?

  2. 双重链表如何在这种情况下提高性能?

  3. 所有方法都继承自hashmap xpt 4方法,然后hashmap的迭代器不维护顺序,而linkedhashmap维护顺序?


9775
2018-01-13 06:19


起源

我不认为双向链表有助于排序,它只是使遍历列表更容易 - Kick Buttowski
它不会使遍历更容易。它只是使删除地图条目更有效。 - Stephen C
这样你就可以倒退了。 - user207421


答案:


你是对的,你只需要维护一个单独的链表来跟踪插入顺序。但是为了有效地维护单链表,你实际上需要一个双向链表。

按顺序考虑三个条目

A ---> B ---> C

假设你删除 B。明显 A 现在应该指出 C。但除非你知道之前的条目 B 你无法有效地说出现在应该指向哪个条目 C。要解决此问题,您需要输入指向两个方向。

  --->   ---> 
A      B      C
  <---   <---

这样,当你删除 B 你可以看看之前和之后的条目 B (A 和 C)并进行更新 A 和 C 指向对方。

原因 LinkedHashMap 保持插入顺序 HashMap 尽管除了4种方法之外的所有方法都是遗传的,但事实并非如此。大多数特定于实现的操作都是 HashMap.Entry不是 HashMapLinkedHashMap 有一个 private static 类 LinkedHashMap.Entry 延伸了 static 类 HashMap.Entry 的 HashMap。你打电话时 put 要么 remove例如,代码 LinkedHashMap 可以与代码相同 HashMap 因为它是 条目本身 跟踪信息之前和之后的信息。作为一个例子,这里是完整的代码 LinkedHashMap.Entry.remove() 我在上面解释

private void remove() {
    before.after = after;
    after.before = before;
}

8
2018-01-13 07:09





LinkedHashMap基本上为每个条目维护两个指针 - : 之前,之后 

顾名思义,这两个指针都用于排序目的,用于在插入或删除时调整指针。


3
2018-01-13 06:38





维持 广告订单 有双重LinkedList。在任何时候你都可以向前移动节点或向后节点。但是如果你的指针移动到最后一个元素,你有单个LinkedList,你再次需要从初始点开始,你不能移动到前一个节点。


1
2018-01-13 06:24



我不认为双向链表有助于排序,它只是使遍历列表更容易 - Kick Buttowski
如果你看到内部HashMap基于linkedList。因此,如果您有关于在之前或之后插入了哪个节点的信息,那么这只是一个排序。 - Prashant
单个链表足以维持订单。对于他们在这种情况下使用双向链表的原因,这不是正确的解释。 - Stephen C
应该指出的是 LinkedHashMap.keySet().iterator() 返回一个平原 Iterator 不是 ListIterator。您无法以反向插入顺序迭代密钥...无论使用双向链接列表这一事实。 API不允许它。 - Stephen C


我还想补充的一点是LinkedHashMap也可以通过其构造函数将accessOrder boolean设置为true来用作LRU Cache。

现在LinkedHashMap维护了两个指针 head(LinkedHashMap中最年长的)和 tails(LinkedHashMap中最年轻的)。因此,当您将accessOrder设置为true时请记住它停止维护插入顺序并开始表现得像正确的LRU缓存。

现在当LRU缓存超过其限制并且我们想要删除最老的条目时,因为它在内部维护DoublyLinkedList,删除最老的条目相对较快,因为它保持两个指针(头部和尾部)可以向两个方向移动或者我们可以说如果它是用于删除最旧条目的Singly LinkedList,我们需要遍历所有节点然后将其删除。感谢指针 head 和 tails它可以很容易地通过在帮助下到达那里去除最后一个节点(最老的节点)来完成 tails 指针并将最后一个节点的前一个指针作为第二个最后一个节点 tail LinkedHashMap中的DoublyLinkedList。


0
2018-04-28 05:29





LinkedHashMap可用于维护插入顺序和维护访问顺序。 LinkedHashMap继承了hashmap中相同的hashmap功能,因此使用了 下一个 参考。

为了维护插入顺序,他们使用了双向链表(使用过 之前 和  参考),但这可以通过使用单链表来完成。同时,他们必须实现访问顺序功能,并且他们需要频繁地将元素移动到最后并且需要频繁删除频繁删除它们使用双向链表。


-1
2017-12-18 18:55