當前位置:
首頁 > 知識 > 每天一道Java題(3)

每天一道Java題(3)

問題

為什麼在重寫equals()方法的同時,必須重寫hashCode()方法?

解答

在《每天一道Java題(2)》中,已經對hashCode()能否判斷兩個對象是否相等做出了解釋。equals()方法與hashCode()方法的關係如下:

  1. 如果兩個對象的hashCode()返回值不一樣,則equals()返回的結果必為false。

  2. 如果兩個對象的hashCode()返回值一樣的時候,equals()返回的結果未知。

  3. 如果兩個對象的equals()返回的結果為true,則兩個對象的hashCode()返回值必定相等。

  4. 如果兩個對象的equals()返回的結果為false,則兩個對象的hashCode()返回值可能不同也可能相同。

可以看出,equals()與hashCode()有著千絲萬縷的關係。簡單的說,如果只重寫了equals(),沒有重寫hashCode()的話,因為hashCode()主要用於散列的集合,這就會造成,當使用equals()為true的兩個相當的對象作為散列集合中的key時,會得出不一樣的結果,這其中原因就是他們的hashCode()返回值不同。

看下面一個例子:

每天一道Java題(3)

每天一道Java題(3)

每天一道Java題(3)

輸出的結果:

每天一道Java題(3)

從中可以看到,equalsAndHashCode1與equalsAndHashCode2的equals()為true,但hashCode()返回值不一樣,這就違背了一開始描述的equals()與hashCode()的關係了。而且也可以看出,在HashMap中,也獲取不出相同key值(equalsAndHashCode1與equalsAndHashCode2的equals()值為true,則認為是相同的對象)的value值了。

引用

對於hashCode()與equals()之間的關係,也可以參考《Effective Java》一書中的描述:

  • 在程序執行期間,只要equals方法的比較操作用到的信息沒有被修改,那麼對這同一個對象調用多次,hashCode方法必須始終如一地返回同一個整數。

  • 如果兩個對象根據equals方法比較是相等的,那麼調用兩個對象的hashCode方法必須返回相同的整數結果。

  • 如果兩個對象根據equals方法比較是不等的,則hashCode方法不一定得返回不同的整數。

學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java團長 的精彩文章:

TAG:Java團長 |