LinkedHashMap的实现与HashMap有何不同?

时间:2010-06-11 06:23:52

标签: java hashmap complexity-theory linkedhashmap

如果LinkedHashMap的时间复杂度与HashMap的复杂性相同,为什么我们需要HashMap?与Java中的HashMap相比,LinkedHashMap的额外开销是多少?

8 个答案:

答案 0 :(得分:31)

LinkedHashMap将占用更多内存。普通HashMap中的每个条目都只有密钥和值。每个LinkedHashMap条目都包含对下一个和上一个条目的引用。还有一些家务要做,虽然这通常是无关紧要的。

答案 1 :(得分:23)

  

如果LinkedHashMap的时间复杂度与HashMap的复杂性相同,为什么我们需要HashMap?

您不应该将复杂性与性能混淆。两种算法可以具有相同的复杂性,但是一种可以始终比另一种更好地执行。

请记住f(N) is O(N)表示:

C1*N <= limit(f(N), N -> infinity) <= C2*N  

其中C1C2是严格的正常数。复杂性没有说明C值的大小。对于两种不同的算法,常量很可能不同

(并且请记住,当N变得非常大时,大O复杂性与行为/性能有关。它不会告诉您关于小N值的行为/性能的任何信息。)


话虽如此,在等效用例中HashMapLinkedHashMap操作之间的性能差异相对较小。通常,额外的内存开销更相关。

答案 2 :(得分:11)

  • LinkedHashMap还维护一个双向链表,该列表贯穿其所有条目,这将提供可重复的顺序。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。
  • HashMap没有这些额外的成本(运行时,空间),如果你不关心插入顺序,它应该优先于LinkedHashMap。

答案 3 :(得分:7)

当您需要知道Map的键的插入顺序时,LinkedHashMap是一个有用的数据结构。一个合适的用例是用于实现LRU高速缓存。由于LinkedHashMap的订单维护,与HashMap相比,数据结构需要额外的内存。如果不需要插入顺序,则应始终使用HashMap。

答案 4 :(得分:5)

HashMap和LinkedHashMap之间还有另一个主要区别:在LinkedHashMap的情况下,迭代效率更高。

由于 LinkedHashMap 中的元素彼此连接,因此迭代需要与地图大小成比例的时间,无论其容量如何。 但是在 HashMap 的情况下;由于没有固定的顺序,因此迭代它需要与其容量成比例的时间。

我已在blog上添加了更多详细信息。

答案 5 :(得分:2)

HashMap不维护插入顺序,因此不会维护任何双向链表。

LinkedHashMap的最突出特点是它维护键值对的插入顺序。 LinkedHashMap使用双重链接列表来执行此操作。

LinkedHashMap的输入如下所示:

  static class Entry<K, V> {
     K key;
     V value;
     Entry<K,V> next;
     Entry<K,V> before, after;        //For maintaining insertion order    
     public Entry(K key, V value, Entry<K,V> next){
         this.key = key;
         this.value = value;
         this.next = next;
     }
  }

通过使用之前和之后 - 我们会跟踪LinkedHashMap中新添加的条目,这有助于我们维护广告订单。

在参考之前的参赛作品之前 之后引用LinkedHashMap中的下一个条目。

有关图表和分步说明,请参阅http://www.javamadesoeasy.com/2015/02/linkedhashmap-custom-implementation.html

答案 6 :(得分:1)

LinkedHashMap继承HashMap,这意味着它使用HashMap的现有实现来在节点(Entry Object)中存储键和值。除此之外,它还存储一个单独的双向链表实现,以维护输入键的插入顺序。

看起来像这样:

标题节点&lt; ---&gt;节点1&lt; ---&gt;节点2&lt; ---&gt;节点3&lt; ----&gt;节点4&lt; ---&gt;标题节点。

因此额外的重载是在这个双向链表中保持插入和删除。 好处是:迭代顺序保证是插入顺序,不在HashMap中。

答案 7 :(得分:0)

  • 重新调整大小应该更快,因为它遍历它 用于将内容传输到新表数组的双链表。
  • containsValue()被重写以利用更快的速度 迭代器。
  • LinkedHashMap也可用于创建LRU缓存。一个特别的 LinkedHashMap(capacity,loadFactor,accessOrderBoolean)构造函数 用于创建迭代顺序为的链接哈希映射 上次访问其条目的顺序,来自 最近访问最近的最近。在这种情况下,仅仅是 使用get()查询地图是一种结构修改。