我有一個哈希映射。我存儲了12個不同的鍵,值對。哈希映射中的舊值被新值覆蓋了嗎?
前8個值存儲正常,但是當我嘗試將第9個值覆蓋舊值時。但尺寸增加。
如果我嘗試獲取舊值,我會得到null
s。我也檢查了哈希映射表。只有8個值。舊的值被覆蓋。 這裏只有7個值,但大小是9。怎麼可能? 我能做什麼錯?
我有一個哈希映射。我存儲了12個不同的鍵,值對。哈希映射中的舊值被新值覆蓋了嗎?
前8個值存儲正常,但是當我嘗試將第9個值覆蓋舊值時。但尺寸增加。
如果我嘗試獲取舊值,我會得到null
s。我也檢查了哈希映射表。只有8個值。舊的值被覆蓋。 這裏只有7個值,但大小是9。怎麼可能? 我能做什麼錯?
至於大小= 9,但表中只有7個值,您誤解了HashMap
的內部工作原理。所有值都不存儲在頂層表中。該表更像是「存儲桶」,用於存儲按某些哈希碼範圍分組的條目。每個「桶」都包含一系列鏈接條目,因此您在表格中看到的只是每個特定範圍鏈中的第一個條目。根據地圖中的條目總數,size
總是正確的。
至於相互覆蓋的條目,只有當您使用與現有條目相同的鍵(hashCode和equals)將en條目放入時纔會發生這種情況。因此,您要麼使用現有密鑰添加,要麼使用null
作爲密鑰添加(空值允許作爲密鑰,但只能使用空值鍵入一個條目)。
檢查您的代碼,您是否加入了null
鍵?如果您正在使用自定義類的實例(您自己創建的實例)作爲密鑰,那麼是否已根據規範(請參閱http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29)實施hashCode()
和equals()
?你是否確定你在所有12個放置操作中都使用了唯一的鍵?
確保您使用不同的密鑰。如果是這種情況,請確保您的密鑰類的equals和hashcode按需要工作,即當兩個對象相等時,它們的哈希碼必須相同。當然,對於不同的關鍵值(或者你期望成爲不同的關鍵字)必須返回false。
如果這沒有幫助,請發佈一個最小但完整(可編譯)的示例來演示您的問題。
我提到了上面的屏幕截圖,請告訴我怎麼可能? – Selva
提供了一些代碼... – chzbrgla
請提供一些代碼,它會讓你的問題變得清晰,並且允許更好的答案 – amit
也許是因爲你使用了同樣的密鑰? – Tobias