2013-04-04 21 views
-2

昨天在我的課上我的教授教哈希,我想知道一件事,哈希表如何存儲對象?哈希映射如何存儲對象internaly

我知道入門課。

但我知道的ArrayList默認情況下可以用10元開始,或者你可以設置此構造中,如果需要,它被設置更多的元素,將創建另一個數組的值複製...

那麼,怎樣的HashMap增長?

感謝

回答

2

直從the javadoc

HashMap中的實例具有影響其性能的兩個參數:初始容量和負載因子。容量是哈希表中桶的數量,初始容量就是哈希表創建時的容量。加載因子是散列表在其容量自動增加之前被允許獲得的滿量程的度量。 當哈希表中的條目數超過負載因子和當前容量的乘積時,哈希表會被重新哈希(即重建內部數據結構),以便哈希表具有大約兩倍的存儲桶數量。

(重點煤礦)

源代碼,如果你想要更多的實施細節也與JDK分佈。

+0

是的,我明白了,你告訴我,但也有一些是...... 客座率我能確定? 當發生重排時,每個鍵的哈希碼會發生什麼? – 2013-04-04 12:09:58

+0

加載因子作爲參數傳遞給構造函數。它默認爲0.75。這在javadoc中有記錄。你爲什麼不讀它?根據定義,rehash會重新計算哈希值並將每個關鍵字重新分配給新的存儲桶。 – 2013-04-04 12:12:04

+0

我在javadoc閱讀了這篇文章,感謝您的幫助@JB Nizet – 2013-04-04 12:13:56

1

HashMap具有Entry內部數組,當沒有指定其他大小,缺省值爲16

我已經做了小塊代碼,在這裏可以看到實際的地圖的大小,和它的內部陣列大小,所以你可以比較。只需更改for循環,以便可以隨意增大。

public static void main(String[] args) throws Exception{ 
    HashMap<Integer, Integer> m = new HashMap<Integer, Integer>(); 

    for(int i = 0 ; i < 100 ; i++){ 
     m.put(i, i); 
     Field table = m.getClass().getDeclaredField("table"); 
     table.setAccessible(true); 
     int tableLength = ((Entry[])table.get(m)).length; 

     System.out.println("Map size: " + m.size()); 
     System.out.println("Internal table size: " + tableLength); 
    } 

}