Java軟件低級錯誤: 定義equals方法的同時也要定義hashCode方法

解讀: 
equals方法用於實現對象之間邏輯上是否相等的判斷,而不是判斷兩個引用是否指向同一個對象,hashCode用於返回對象的哈希碼(也有翻譯成散列碼的),邏輯上相等(equals比較相等)的兩個不同對象它們返回的hashCode值肯定不相等。 Java規範中規定:如果兩個對象根據equals(Object)方法是相等的,那麼調用這兩個對象中任一個對象的hashCode方法必須產生同樣的整數結果,所以定義equals的同時一定要定義hashCode,並且要保證equals比較相等的對象,hashCode返回值也必須相同。


¨案例: 

Map<MyStruct, String> m = new HashMap<MyStruct, String>(); 
m.put(new MyStruct(707), "Jenny"); 
System.out.println(m.get(new MyStruct(707))); 
上面的代碼,MyStruct定義了equals方法,沒有定義hashCode,輸出的結果原本希望是Jenny,但結果卻是null,上面的類定義違反了上面所說的Java規範,運行時實際上有兩個MyStruct對象,但邏輯上是同一個對象。MyStruct使用了默認的hashCode實現,使的邏輯上相同的對象(equals比較相等),它們的hashCode卻不同,Map查找對象的時候會首先比較hashCode值,然後再使用equals比較,造成Map無法找到期望的對象。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章