如果LinkedHashMap的时间复杂度与HashMap的复杂度相同,为什么需要HashMap?与Java中的HashMap相比,LinkedHashMap具有哪些额外开销?LinkedHashMap的实现与HashMap有什么不同?
回答
LinkedHashMap将占用更多内存。正常的HashMap
中的每个条目都具有密钥和值。每个LinkedHashMap
条目具有对下一个和前一个条目的引用和的引用。还有一点家务要做,尽管这通常是无关紧要的。
- LinkedHashMap还维护一个双向链接列表,其中运行所有条目,这将提供一个可重复的顺序。这个链表定义了迭代排序,这通常是键被插入映射的顺序(插入顺序)。
- HashMap没有这些额外成本(运行时间,空间),并且当您不关心广告订单时应该首选LinkedHashMap。
我认为你的意思是迭代次序? – 2011-11-13 00:29:39
@MichaelDeardeuff你是对的,但答案通常是正确的,因为迭代顺序=插入顺序deafult。可能替代*插入顺序*是*访问顺序*。 – 2014-12-16 09:58:31
当你需要知道键的映射顺序时,LinkedHashMap是一个有用的数据结构。一个合适的用例是用于实现LRU缓存。由于LinkedHashMap的维护顺序,与HashMap相比,数据结构需要额外的内存。在插入顺序不是要求的情况下,您应该始终使用HashMap。
如果LinkedHashMap的时间复杂度与HashMap的复杂度相同,为什么我们需要HashMap?
您不应该将复杂性与性能混淆。两种算法可以具有相同的复杂性,但是可以一致地执行比其他更好的算法。
记住f(N) is O(N)
意味着:
C1*N <= limit(f(N), N -> infinity) <= C2*N
其中C1
和C2
是严格为正的常数。复杂性没有说明数值有多大或多么小。对于两种不同的算法,常数很可能是不同的。
(请记住,大O的复杂性有关的行为/性能N
变得非常大。它会告诉你什么关于小N
值的行为/性能。)
话虽如此,在等效用例中的HashMap
和LinkedHashMap
操作之间的性能差异相对较小。通常,更多相关的额外内存开销。
这是一组优秀的区别。 – Jared 2016-02-26 20:33:07
HashMap和LinkedHashMap之间还有另一个主要区别:在LinkedHashMap的情况下,迭代更有效率。
如LinkedHashMap的元素被相互连接,以便迭代需要时间正比于地图的大小,不管其容量。 但是在HashMap;因为没有固定的顺序,所以迭代它需要时间与其容量成正比。
我在我的blog上放了更多细节。
- 重新上浆应该是较快,因为它通过其 双链表遍历到的内容传送到一个新的表阵列。
- containsValue()被覆盖以利用更快的迭代器 。
- LinkedHashMap也可用于创建LRU缓存。提供了一个特殊的 LinkedHashMap(capacity,loadFactor,accessOrderBoolean)构造函数 用于创建链接哈希映射,其迭代顺序为 上次访问它的条目的顺序,从最近最少访问到最近访问的 。在这种情况下,只有 用get()查询地图是一个结构修改。
LinkedHashMap继承了HashMap,这意味着它使用HashMap的现有实现在Node(Entry对象)中存储键和值。除此之外,它存储一个单独的双向链表实现来维护已输入密钥的插入顺序。
它看起来像这样:
头节点< --->节点1 < --->节点2 < --->节点3 < ---->节点4 < --->头节点。
所以额外的重载是在这个双向链表中保持插入和删除。 好处是:迭代顺序保证是插入顺序,它不在HashMap中。
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没有实现SortedMap?
- 2. 同时扩展HashMap和LinkedHashMap?
- 3. 为什么有不同的Ruby实现?
- 4. HashMap的:借在同一时间的什么,我想实现
- 5. MySQL与SQL的具体实现有什么不同?
- 6. 引用与实现中的指针有什么不同?
- 7. 不同浏览器的实现有什么不同?
- 8. 为什么LinkedList作为HashMap的存储桶实现而不是另一个Hashmap?
- 9. 为什么有这么多不同的base64实现?
- 10. 什么时候在java中通过hashmap使用linkedhashmap?
- 11. 为什么在LinkedHashMap中迭代通过桶比HashMap快?
- 12. 什么是它不同的实现上(Jython/IronPython的/ pypy /等)与
- 13. LinkedHashMap vs HashMap!= LinkedList vs ArrayList
- 14. “((...))”与“(...)”有什么不同?
- 15. 为什么呈现的像素与真实像素不同?
- 16. 为什么HashMap大小与文件中的行数不同?
- 17. HashMap的实现:--- hashcode
- 18. iOS 4和iOS 5上APNS的实现有什么不同吗?
- 19. ConstraintSet中clone()的不同实现之间有什么区别?
- 20. 为什么Java的HashMap具有不同对象的不同行为?
- 21. 为什么HashSet的作为HashMap的内部实现
- 22. App.OnSearchActivated与App.OnActivated与ActivationKind.Search有什么不同?
- 23. 为什么我的HashMap实现比JDK慢10倍?
- 24. 为什么HashSet实现中的HashMap瞬态?
- 25. 慢mergesort实现,有什么不对?
- 26. Android实现具有hashmap的Parcelable对象
- 27. FFT与DFT有什么不同,以及如何在C++中实现它们?
- 28. wget与Perl的lwp有什么不同?
- 29. 实现一个双缓冲的java不同步的HashMap读取
- 30. 为什么要订购LinkedHashMap?
其结果是,性能稍低相比HashMap中的。 – Snehal 2010-06-11 06:32:21
@Jon Skeet它是不是像LinkedHashMap中的值包含对上一个值和下一个值的额外引用,删除或插入任何项目都需要额外的费用来重新连接?如果我得到完整的实现或者有链接或解释,那将是非常棒的。 – 2010-06-11 06:39:41
@热情的程序员:源代码是公开的 - 为什么不看那里?是的,插入和删除确实需要更新链接列表。 – 2010-06-11 06:58:24