Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的 時候也會用到這兩個方法。
如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此可能會被集合認為是相等的。
而且,這兩個方法也用來發現重複元素,所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。
HashMap的很多函數要基於hashCode()方法和equals()方法,hashCode()用來定位要存放的位置,equals()用來判斷是否相等。
相等的概念是什麼?
Object的equals()只是簡單地判斷是不是同一個實例,但是有時候我們想要的是邏輯上的相等。比如一個學生類Student,有一個成員變量studentID,只要StudentID相等,不是同一個實例我們也認為是同一個學生。當我們認為判定equals的相等應該是邏輯上的相等而不是只判斷是不是內存中的同一個東西的時候,我們就應該重寫equals()。而涉及到HashMap的時候,重寫了equals()就要重寫hashCode()。
總結:
- 同一個對象(沒有發生過修改)無論何時調用hashCode(),得到的返回值必須一樣。
- hashCode()返回值相等,對象不一定相等,通過hashCode()和equals()必須能唯一確定一個對象。
- 一旦重寫了equals(),就必須重寫hashCode()。而且hashCode()生成哈希值的依據應該是equals()中用來比較是否相等的欄位。如果兩個由equals()規定相等的對象生成的hashCode不等,對於HashMap來說,他們可能分別映射到不同位置,沒有調用equals()比較是否相等的機會,兩個實際上相等的對象可能被插入到不同位置,出現錯誤。其他一些基於哈希方法的集合類可能也會有這個問題。