[英]Hash Map entries collision
我正在嘗試此代碼段
Map headers=new HashMap();
headers.put("X-Capillary-Relay","abcd");
headers.put("Message-ID","abcd");
現在,當我做一個get
對任何按鍵的它的工作的罰款。 但是我在Eclipse調試器上看到了一個奇怪的現象。 當我調試並進入變量並首先檢查table
條目內部時,我看到了這一點
->table
--->[4]
------>key:X-Capillary-Relay
...........
但是經過第二行調試后我得到了
->table
--->[4]
------>key:Message-ID
...........
它不會創建新條目,而是覆蓋現有密鑰。 對於任何其他鍵,不會發生此覆蓋。 地圖的大小顯示為2.並且兩個鍵的get
適用。 那么eclipse調試器中這種差異背后的原因是什么呢? 這是日食問題嗎? 或者哈希問題。 對於2個鍵,哈希碼是不同的。
鍵的hashCode
不按原樣使用。
它應用了兩個轉換(至少基於Java 6代碼):
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
和
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
由於length是HashMap的初始容量(默認為16),因此兩個鍵都得到4:
System.out.println (hash("X-Capillary-Relay".hashCode ())&(16-1));
System.out.println (hash("Message-ID".hashCode ())&(16-1));
因此,兩個條目都存儲在映射的同一個桶中的鏈表中( table
數組的索引4
,如調試器中所示)。 調試器只顯示其中一個這一事實並不意味着另一個被覆蓋。 這意味着您可以看到鏈接列表的第一個條目的鍵,並且每個新條目都會添加到列表的開頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.