簡體   English   中英

HashMap如何確保使用key的hashcode計算的索引在可用范圍內?

[英]How does HashMap make sure the index calculated using hashcode of key is within the available range?

我瀏覽了HashMap的源代碼,並提出了一些問題。 PUT方法采用Key和Value

  1. 密鑰哈希碼的哈希函數。
  2. 使用從上一步驟獲得的哈希計算該對的桶位置

     public V put(K key, V value) { int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); ..... } static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } static int indexFor(int h, int length) { return h & (length-1); } 

例:

  • 創建大小為10的HashMap。
  • call put(k,v)三次並假設這3個占用桶位7,8和9
  • 呼叫放入第4 K,V對以及后續發生
    • 使用key.hashcode()調用hash()並計算哈希值
    • indexFor基於哈希計算

題:

  1. 如果計算出的第4個k,v的存儲區位置超出現有邊界怎么辦? 說位置11?

在此先感謝Akh

對於你的第一個問題:地圖總是使用2的冪作為大小(如果你給它一個10的容量,它實際上將使用16),這意味着index & (length - 1)將始終在[0, length)的范圍內[0, length)所以它總是在范圍內。

目前尚不清楚你的第二個和第三個問題是關於什么的。 我不認為 HashMap重新分配所有內容,除非它需要。

HashMaps通常會使用散列碼來修改桶的數量。 發生沖突時會發生什么取決於實現(對Java的HashMap不確定)。 有兩種基本策略:保留存儲桶中的項目列表,或者如果存儲桶已滿,則跳轉到其他存儲桶。 我的猜測是HashMap使用列表桶方法。

讓我們更詳細一點,hashmap如何初始化桶大小?

以下代碼來自HashMap.java

while(i <paramInt)i << = 1;

如果你傳遞的是10,那么上面的代碼用來表示權力2.所以使用上面的代碼HashMap初始化桶大小16;

以下代碼用於計算桶索引,

static int indexFor(int h, int length) {
        return h & (length - 1);
    }

暫無
暫無

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

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