每天一道Java題(3)
問題
為什麼在重寫equals()方法的同時,必須重寫hashCode()方法?
解答
在《每天一道Java題(2)》中,已經對hashCode()能否判斷兩個對象是否相等做出了解釋。equals()方法與hashCode()方法的關係如下:
如果兩個對象的hashCode()返回值不一樣,則equals()返回的結果必為false。
如果兩個對象的hashCode()返回值一樣的時候,equals()返回的結果未知。
如果兩個對象的equals()返回的結果為true,則兩個對象的hashCode()返回值必定相等。
如果兩個對象的equals()返回的結果為false,則兩個對象的hashCode()返回值可能不同也可能相同。
可以看出,equals()與hashCode()有著千絲萬縷的關係。簡單的說,如果只重寫了equals(),沒有重寫hashCode()的話,因為hashCode()主要用於散列的集合,這就會造成,當使用equals()為true的兩個相當的對象作為散列集合中的key時,會得出不一樣的結果,這其中原因就是他們的hashCode()返回值不同。
看下面一個例子:
輸出的結果:
從中可以看到,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!


TAG:Java團長 |