簡體   English   中英

哈希映射條目沖突

[英]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.

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