3 回答

TA貢獻1835條經驗 獲得超7個贊
以下是我在閱讀 Effective Java 2nd Edition 時的筆記:
Equals 必須遵守一般合同:
反身的:對于
non-null x
:x.equals(x) == true
對稱:對于
non-null x,y
:x.equals(y) <==> y.equals(x)
傳遞:對于
non-null x,y,z
:x.equals(y) and y.equals(z) ==> x.equals(z) == true
一致:對于任何非空 x,y: if
x.equals(y) == true
,如果x
和y
空:對于非空
x
:x.equals(null) == false
高質量等于方法:
使用 == 檢查參數是否是對該對象的引用 (
x == x
)使用 instanceof 檢查參數是否是正確的類型(也檢查
null
)將參數轉換為正確的類型
對于類中的每個“重要”字段,檢查參數的該字段是否與該對象的相應字段匹配
完成后,檢查是否對稱、傳遞和一致
最后的警告:
覆蓋 equals 時始終覆蓋 hashCode
不要試圖太聰明
不要在 equals 聲明中用其他類型替換 Object -> 不值得為了增加復雜性而獲得輕微的性能提升
來自 Effective Java 2nd Edition 的Hashcode直接引用
在名為 result 的 int 變量中存儲一些常量非零值,例如 17。
對于
f
對象中的每個重要字段(即 equals 方法考慮的每個字段),請執行以下操作:計算字段的 int 哈希碼 c:
將步驟 2.a 中計算的哈希碼 c 合并到結果中,如下所示:
result = 31 * result + c;
如果該字段是布爾值,則計算
(f ? 1 : 0)
.如果該字段是
byte, char, short, or int, compute (int) f.
如果該字段是
long, compute (int) (f ^ (f >>> 32)).
如果該字段是
float, compute Float.floatToIntBits(f).
如果字段是 a
double, compute Double.doubleToLongBits(f)
,則對結果進行哈希處理long
。如果該字段是對象引用并且此類的 equals 方法通過遞歸調用比較該字段,則在該字段上
equals
遞歸調用hashCode
。如果需要更復雜的比較,請為此字段計算“規范表示”并在規范表示上調用 hashCode。如果字段的值為null
,return 0
(或其他一些常數,但 0 是傳統的)。如果該字段是一個數組,則將其視為每個元素都是一個單獨的字段。也就是說,通過遞歸應用這些規則來計算每個重要元素的哈希碼,并在步驟 2.b 中組合這些值。如果數組字段中的每個元素都很重要,則可以使用 1.5 版中添加的 Arrays.hashCode 方法之一。
返回結果。
當你寫完 hashCode 方法后,問問自己相等的實例是否有相等的哈希碼。編寫單元測試來驗證你的直覺!
所以遵循這些規則:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Employee)) {
return false;
}
Employee other = (Employee) obj;
return super.equals(other) &&
Double.compare(this.salary, other.salary) == 0 &&
this.hireDay.equals(other.hireDay);
}
在您的情況下,雖然它似乎id應該已經唯一地標識任何人,所以您應該只使用它進行比較,而不是在任何子類中覆蓋它。

TA貢獻1951條經驗 獲得超3個贊
如果你想實現 equals 和 hashcode 方法使用 eclipse 只需右鍵單擊文件轉到源并選擇 generate equals() & hashcode() 和你需要的字段,如下所示:

TA貢獻1757條經驗 獲得超8個贊
兩個人有沒有可能永遠一樣id
?它不應該。所以邏輯延伸到Employee
類,這意味著在類中實現equals
和就足夠了。hashCode
Person
此時,由于您只處理一個int
,您可以使用Integer.hashCode(id)
forhashCode
并僅比較 的值equals
。
添加回答
舉報