2016-01-29 43 views
0

我只是想驗證我的下面的理解,所以請建議。哈希映射哈希表大小限制小於數組索引的最大允許限制

在Java中,規則排列可以有指數高達int類型,爲2 raised to power 31 minus -1,自HashMapMAXIMUM_CAPACITYint過的最大值,它可以達到這個值了。

但由於HashMap內部需要表長度(桶大小)是一個power of two所以限制被縮減到 - static final int MAXIMUM_CAPACITY = 1 << 30;因爲該值nearest power of two1<<31 -1

我的理解是否正確?

所有答案here提到只有符號位限制,但不power of two要求,

/** 
    * The table, resized as necessary. Length MUST Always be a power of two. 
    */ 

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; 

而且,據我所知,大小限制arrayHashmap(桶大小)無關,與system/object/heap memory侷限性,但MAX_RANGE爲int僅數據類型(索引數據類型)和其他邏輯要求(如兩個冪等)。

回答

1

你是(more or less)在你對數組大小的推理中是正確的。

但內部陣列HashMap.table上的大小限制不限制HashMap(即可存儲在HashMap中的數字條目)的大小。

該數組中的每個元素實際上都是無限大小的Entry對象的鏈接列表,因此對可存儲在HashMap中的條目數量沒有硬性限制。

1

數組的限制是2 ^^ 30,因爲這是數組中最大的兩個數組。然而,沒有理由認爲散列映射僅限於這個大小,而是圍繞這一點散列映射降級到鏈表(或Java 8中的樹)的散列,即對每個存儲桶中的條目數量。