1. 程式人生 > >[每日一問]---hashCode()和equals()方法的重要性體現在什麼地方?

[每日一問]---hashCode()和equals()方法的重要性體現在什麼地方?

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()比較是否相等的機會,兩個實際上相等的物件可能被插入到不同位置,出現錯誤。其他一些基於雜湊方法的集合類可能也會有這個問題。