[英]How does HashMap make sure the index calculated using hashcode of key is within the available range?
我瀏覽了HashMap的源代碼,並提出了一些問題。 PUT方法采用Key和Value
使用從上一步驟獲得的哈希計算該對的桶位置
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); }
例:
題:
在此先感謝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.