簡體   English   中英

鍵條目在HashMap中為空字符串或null

[英]key Entry as Empty String or null in HashMap

在Hashmap中,對於null鍵,索引為0,但對於Empty string,索引將為0。 我對其進行調試,發現它正在第0個索引處創建一個鏈表並將兩個值存儲在那里。

那么,為什么空字符串值存儲在第0個位置,並且如果它使用空字符串的哈希圖計算索引,那么空字符串的哈希碼將是什么。

HashMap<String, String> hm= new HashMap<>();
hm.put("", "");
hm.put(null, null);

空字符串的哈希碼至少在Oracle的Java 8實現中為0

這是Java 1.8中用於計算哈希的方法的`java.util.HashMap類的源代碼的摘錄:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

這是計算哈希的相關方法。

因此,從本質上講,這是它計算空字符串的哈希碼的方式:

System.out.println(("".hashCode()) ^ ("".hashCode() >>> 16));

無論如何, null的哈希碼將為0 請參見上面帶有hash方法的代碼。

因為空字符串的哈希碼返回0,並且它與空對象的值相同。 因此,您遇到了哈希沖突,因此它進入了同一單元格。

*至少對於String類中的當前實現-可能會改變一天

Java中的哈希碼必須滿足以下要求

  • 在Java應用程序的執行過程中,只要在同一對象上多次調用它,則hashCode方法必須一致地返回相同的整數,前提是未修改該對象的equals比較中使用的信息。 從一個應用程序的執行到同一應用程序的另一執行,此整數不必保持一致。

注意最后一句話。 這使得在同一應用程序的不同運行之間哈希碼是不可預測的,從而防止了某種拒絕服務攻擊。

因此,無法預測任何特定對象(它為null還是實際對象)的哈希碼。 您只知道對於相同的對象以及根據equals方法等於該對象的對象來說,它將是相同的。

暫無
暫無

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

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