如果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