LinkedHashMap的实现与HashMap有何不同?

问题描述 投票:37回答:8

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

java hashmap complexity-theory linkedhashmap
8个回答
34
投票

LinkedHashMap将占用更多内存。普通HashMap中的每个条目都只有键和值。每个LinkedHashMap条目都具有对下一个和上一个条目的引用引用。尽管通常这是无关紧要的,但还需要做更多的内务处理。


25
投票

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

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

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

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

其中C是常数。复杂度并不能说明C值的大小。对于两种不同的算法,常数C很可能是different

((请记住,大[0]复杂度与行为/性能有关,因为N变得非常大。对于较小的N值,它不会告诉您有关行为/性能。)


说过:

  • 在同等使用情况下,HashMapLinkedHashMap操作之间的性能差异相对较小。

  • A LinkedHashMap使用更多的内存。例如,Java 11实现在每个映射条目中都有两个附加的参考字段,以表示之前/之后的列表。在没有压缩OOP的64位平台上,每个条目的额外开销为16个字节。

  • 性能和/或内存使用方面的相对较小的差异实际上对具有性能或内存关键应用程序的人很重要1

1-...以及对那些不必要地迷恋这些事情的人。


13
投票
  • LinkedHashMap还会在其所有条目中维护一个双向链接的列表,这将提供可重复的顺序。此链表定义了迭代顺序,通常是将键插入映射中的顺序(插入顺序)。
  • HashMap没有这些额外的费用(运行时,空间),当您不关心插入顺序时,它应该比LinkedHashMap更为可取。

7
投票

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


5
投票

HashMap和LinkedHashMap之间还有另一个主要区别:对于LinkedHashMap,迭代效率更高。

因为LinkedHashMap中的元素相互连接,所以迭代需要的时间与地图的大小成正比,而不管其容量如何。但是在HashMap的情况下;由于没有固定顺序,因此对其进行迭代需要的时间与其容量成正比。

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


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


1
投票

LinkedHashMap继承了HashMap,这意味着它使用HashMap的现有实现将键和值存储在Node(条目对象)中。除此之外,它还存储一个单独的双链表实现,以保持输入键的插入顺序。

看起来像这样:

头节点节点1 节点2 节点3 节点4 头节点。

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


0
投票
  • 调整大小应该更快,因为它遍历了双向链接列表以将内容传输到新的表数组中。
  • containsValue()被重写以利用更快的速度迭代器。
  • LinkedHashMap也可以用于创建LRU缓存。一个特别的LinkedHashMap(capacity,loadFactor,accessOrderBoolean)构造函数提供以创建链接的哈希图,其迭代顺序为上次访问其条目的顺序,从最近访问到最近。在这种情况下,使用get()查询地图是一种结构上的修改。
© www.soinside.com 2019 - 2024. All rights reserved.