2015-01-13 29 views
11

因为在任何线程中都没有内部和合理的解释。 请给我确切的理由。为什么linkedhashmap维护迭代的双向链表

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

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

  3. 所有的方法都是从hashmap xpt 4方法继承的,那么hashmap的迭代器不维护顺序,而linkedhashmap维护顺序?

+0

我不认为双向链表帮助排序,它只是使遍历列表更容易 –

+0

它不会使遍历更容易。它只是使得地图条目的移除更有效率。 –

回答

1

为了保持插入顺序有双链表。在任何时间点,您都可以前进节点或后退节点。但是如果你有一个LinkedList,如果你的指针移动到最后一个元素,你需要再次从初始点开始,并且不能移动到前一个节点上。

+2

我不认为双向链表帮助排序,它只是使遍历列表更容易 –

+0

如果您看到内部HashMap是基于linkedList。所以如果你有一些信息,比如之前或之后插入了哪个节点,那简直是一种排序。 – Prashant

+0

单独链接列表足以维护订单。这不是他们为什么在这种情况下使用双向链表的正确解释。 –

3

的LinkedHashMap的基本维护两个指针即每个条目 - : 之前,

后的名称表明这两个指针被用于排序目的,并且用于插入的情况下,调整指针或删除。

8

你是对的,你只需要维护一个单独的链接列表来跟踪广告订单。但为了有效地维护一个单一的链表,你实际上需要一个双向链表。

考虑三个条目,以便

A ---> B ---> C 

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

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

这样,当你删除B你可以看看之前的条目后BAC)和更新,以便AC指向对方。

LinkedHashMap原因LinkedHashMap维持插入顺序,而HashMap没有,尽管除了4个方法都被继承外,其实它是非常巧妙的写法。大多数实施特定的操作都是HashMap.Entry的成员,而不是HashMapLinkedHashMap有一个private static类别LinkedHashMap.Entry它扩展了static类别HashMap.EntryHashMap。例如,当您拨打putremove时,LinkedHashMap的代码可以与HashMap的代码相同,因为它是条目本身,用于跟踪信息前后的信息。作为一个例子,在这里是在充分的代码LinkedHashMap.Entry.remove()我被解释上述

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

LinkedHashMap的可用于维持插入顺序和用于维持访问顺序。 LinkedHashMap继承了hashmap的相同功能,用于维护桶中的列表,所以用下一个参考。

为了维持他们采用双向链表的插入顺序(使用之前之后引用),但是可以通过使用单链表来完成。同时他们必须实现访问顺序功能,并且他们需要经常移动元素到最后,并且需要频繁删除频繁删除他们使用双向链表。