,作爲人的定義:如何覆蓋這個hashCode方法?
public class Person {
private int id;
private int characteristics;
public boolean equals (Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Person) {
if (id == ((Person) obj).id) {
return true;
} else if (characteristics == ((Person) obj).characteristics) {
return true;
}
}
return false;
}
}
原因2個Person
對象a
和b
必須有相同的哈希碼,如果a.equals(b)
回報true
,應該怎麼實現hashCode
方法?
解決方案
我equals
方法實現,根據Java的等效協議是不正確的:傳遞不滿意:a.id = 1
,a.characteristic = 2
,b.id = 1
,b.characteristic = 3
,c.id = 2
,c.characteristic = 3
; a.equals(b) == true
,b.equals(c) == true
,但是a.equals(c) == false
。
您可以異或ID和特徵變量。 –
爲了記錄,您可以將第二組這些「if」轉換爲回報,即。 'return obj instanceof Person &&(id ==((Person)obj).id || characteristics ==((Person)obj).characteristics);'。你還應該在當前代碼的末尾註意'return false',因爲你的'equals'方法可能不會返回任何東西。 – SimplyPanda
@SimplyPanda第一個是完全錯誤的。 'return obj == this;'如果'obj'不是相同的實例,將會返回false,但是可能仍然是相等的值。 – cdhowie