當我們將鍵值對放入HashMap時,可能發生兩個鍵的哈希碼相同,那麼在這種情況下如何處理鍵值的存儲和檢索。HashMap中的衝突解析
更新
我瞭解到目前爲止,如果兩個物體鍵具有相同的散列碼則這兩個關鍵對象將被存儲在同一個桶時,我會說:get(key)
再出相匹配的哈希碼兩個對象哪個元素取決於object.equals()
。
當我們將鍵值對放入HashMap時,可能發生兩個鍵的哈希碼相同,那麼在這種情況下如何處理鍵值的存儲和檢索。HashMap中的衝突解析
更新
我瞭解到目前爲止,如果兩個物體鍵具有相同的散列碼則這兩個關鍵對象將被存儲在同一個桶時,我會說:get(key)
再出相匹配的哈希碼兩個對象哪個元素取決於object.equals()
。
如果您想從hashmap中檢索某個對象,並且存在多個具有相同散列碼的對象,java將調用equals()
來確定正確的對象。
這就是爲什麼在覆蓋hashCode()
時覆蓋equals()
如此重要的原因。
關於檢索的好處 –
感謝您的簡單明確的答案,但我仍然有困惑,所以請你評論我的問題的更新 –
是的,沒錯。我們將迭代桶中的鍵列表,並在我們的鍵上調用equals()來比較它們,直到找到匹配。 –
每個存儲桶都由一個鏈表來表示,因此存儲桶中條目的數量沒有限制(除堆空間外)。有可能存在比可能的hashCode結果少的桶,所以多個散列碼被映射到相同的桶,而不僅僅是具有相同hashCode的鍵。
帶有許多衝突的A hashCode()
或帶有太少桶的HashMap可以使一些鏈表長。良好的性能取決於短鏈表,因爲查找的最後階段是對其中一個鏈表的線性掃描。
我同意上面的答案,一場比賽取決於equals()
和hashCode()
。
+1表示「桶的數量比可能的hashCode結果少,因此多個散列碼映射到同一個桶,而不僅僅是具有相同散列碼的鍵」 – Atul
http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions –
http://stackoverflow.com/questions/12945894/java-hashmap-confusion-about-collision-handling並得到方法 –