2011-07-26 42 views
-2

我有一個哈希映射。我存儲了12個不同的鍵,值對。哈希映射中的舊值被新值覆蓋了嗎?

前8個值存儲正常,但是當我嘗試將第9個值覆蓋舊值時。但尺寸增加。

如果我嘗試獲取舊值,我會得到null s。我也檢查了哈希映射表。只有8個值。舊的值被覆蓋。 這裏只有7個值,但大小是9。怎麼可能? 我能做什麼錯? enter image description here

+4

提供了一些代碼... – chzbrgla

+1

請提供一些代碼,它會讓你的問題變得清晰,並且允許更好的答案 – amit

+0

也許是因爲你使用了同樣的密鑰? – Tobias

回答

4

至於大小= 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個放置操作中都使用了唯一的鍵?

+0

s ,,,我只用唯一鍵,,, – Selva

+0

你真的確定,你已經正確地實現了哈希碼和等於方法嗎?如果是這樣,它會正常工作,所以我認爲,某處是一個錯誤,請張貼您的源代碼 – dunni

+0

@Selva:如果你在做put()在你的HashMap中有12次,並且之後你在地圖中只有9個條目,那麼你就沒有使用唯一的鍵值得記住在這個上下文中unique的定義:hashCode()對象和equals() )產生false,或者你至少有4個相等的鍵,或者你錯誤地實現了hashCode()和equals()(如果你使用自定義對象作爲鍵)。 – pap

6

確保您使用不同的密鑰。如果是這種情況,請確保您的密鑰類的equals和hashcode按需要工作,即當兩個對象相等時,它們的哈希碼必須相同。當然,對於不同的關鍵值(或者你期望成爲不同的關鍵字)必須返回false。

如果這沒有幫助,請發佈一個最小但完整(可編譯)的示例來演示您的問題。

+0

我提到了上面的屏幕截圖,請告訴我怎麼可能? – Selva