簡體   English   中英

為什么java.util.HashMap在內部使用鏈接列表

[英]Why does java.util.HashMap use a linked list internally

我對java.util.HashMap的概念理解如下:

  1. 假設沒有沖突,它相對於其他Map實現的主要優勢是恆定的查找時間。 因此,基礎實現使用固定長度的數組-計算機科學中唯一具有O(1)查找的數據結構。

  2. 當Map的大小接近固定長度的長度時,用於存儲Map條目的固定長度數組在實例化時初始化為給定的大小並擴展(通過擴展,我的意思是創建了一個更大的數組並復制了值)陣列。

  3. 將值放入Map中時,鍵值對將放入給定鍵的內部鏈接列表實現中。 發生沖突時,會將隨后的鍵值對附加到列表中。

  4. 從Map中獲取時,鍵的hashCode()用於派生內部鏈表實現的數組索引,如果列表的大小為1,則可以獲取值,或者在列表上迭代調用equals()每個元素的鍵,直到找到您的值。

基於點2,HashMap必須擴展一個數組,該數組肯定是線性的。 為什么將內部鏈表實現(O(n)查找)用於沖突解決? 為什么不使用帶有O(log n)查找的數據結構(例如二叉樹或紅黑樹)來提高性能?

http://openjdk.java.net/jeps/180

從Java 8開始,如果有足夠的沖突,HashMap的確會退回到二叉樹。

盡管它不能保證O(1)的插入時間,但確實可以分攤 O(1)的插入時間,也就是說,如果您一個接一個地插入大量元素,則總插入時間為與您插入的元素數量成比例。

更改用於存儲桶的數據結構不會對此有所改善。 數組擴展的重點是確保每個存儲桶中預期的條目數是恆定的 這意味着即使有鏈表也仍然可以進行固定時間的插入和查找。

根據何時擴展以及擴展多少(通過增加數組大小),對數字進行了非常仔細的計算。 它與ArrayList中使用的技術非常相似,以確保將O(1)攤銷到列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM