2016-06-21 35 views
1

最近,我參加了一次採訪,面試官問了我這個問題。在hashmap中可以重複散列多少次

一次HashMap中可能會發生多少次重新哈希?兩次?或N次? [當每次添加(閾值+1)元素時]

我知道當地圖滿了時,它很可能是我們做錯了什麼。

我承認我無法給出滿意的答案。任何人都可以告訴我回答這些問題的方法。或者,面試官在一個令人信服的答案中尋找什麼?

下面是我在提出這個問題之前提到的一些SO問題。

https://stackoverflow.com/a/28811708 「當映射中的元素數量達到閾值時,完成哈希映射的重新哈希」哈希映射的負載因子爲0.75,默認初始容量值爲16.一旦元素數達到或穿過地圖發生的12個元素容量重構。

Rehashing in Hashmap

當在散列映射條目的數量超過了負載因數和電流容量的乘積,哈希映射重新散列(內部數據結構被重建),從而使哈希映射具有大約桶數的兩倍。 當您將所有內容重新組合並移動到新的位置(存儲桶等)時,舊的元素也會再次重新存儲並根據其新的哈希碼存儲在新存儲區中。分配用於存儲元素的舊空間是垃圾收集。

https://stackoverflow.com/a/27384645/5086633

回答

3

這取決於從樣圖。

例如用於HashMap的存在被定義爲如下的方法調整大小:

老調重彈此圖的內容與一個更大的容量的新的數組。當此映射中的鍵數達到其閾值時,此方法爲自動調用。如果當前容量爲MAXIMUM_CAPACITY,則此方法不調整地圖大小,但將閾值設置爲Integer.MAX_VALUE。這具有防止未來呼叫的效果。 參數: newCapacity新容量,必須是2的冪;必須大於當前容量,除非當前容量爲MAXIMUM_CAPACITY(在這種情況下,值無關)

因此,根據這個定義,可以將兩個冪的步長放大到MAXIMUM_CAPACITY

MAXIMUM_CAPACITY值是

static final int MAXIMUM_CAPACITY = 1 << 30; 

這個值是1.073.741.824。

建立一個新的HashMap說明初始容量爲1,最多可以有30個調整大小,因爲2^30 = MAXIMUM_CAPACITY = 1.073.741.824

+0

ok ... if(oldCapacity == MAXIMUM_CAPACITY){threshold} = Integer.MAX_VALUE; return; } – yeppe

+1

確切的數字可能會稍微少一點,有很多地方要檢查*最小*表格大小和增長時應用的確切規則。但是這個答案給出了一個很好的估計,它應該足以回答面試問題。 – Durandal