如果LinkedHashMap的时间复杂度与HashMap的复杂性相同,为什么我们需要HashMap?与Java中的HashMap相比,LinkedHashMap的额外开销是多少?
答案 0 :(得分:31)
LinkedHashMap将占用更多内存。普通HashMap
中的每个条目都只有密钥和值。每个LinkedHashMap
条目都包含对下一个和上一个条目的引用和。还有一些家务要做,虽然这通常是无关紧要的。
答案 1 :(得分:23)
如果LinkedHashMap的时间复杂度与HashMap的复杂性相同,为什么我们需要HashMap?
您不应该将复杂性与性能混淆。两种算法可以具有相同的复杂性,但是一种可以始终比另一种更好地执行。
请记住f(N) is O(N)
表示:
C1*N <= limit(f(N), N -> infinity) <= C2*N
其中C1
和C2
是严格的正常数。复杂性没有说明C
值的大小。对于两种不同的算法,常量很可能不同。
(并且请记住,当N
变得非常大时,大O复杂性与行为/性能有关。它不会告诉您关于小N
值的行为/性能的任何信息。)
话虽如此,在等效用例中HashMap
和LinkedHashMap
操作之间的性能差异相对较小。通常,额外的内存开销更相关。
答案 2 :(得分:11)
答案 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)