3 回答
TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
以下是我在閱讀 Effective Java 2nd Edition 時(shí)的筆記:
Equals 必須遵守一般合同:
反身的:對(duì)于
non-null x:x.equals(x) == true對(duì)稱:對(duì)于
non-null x,y:x.equals(y) <==> y.equals(x)傳遞:對(duì)于
non-null x,y,z:x.equals(y) and y.equals(z) ==> x.equals(z) == true一致:對(duì)于任何非空 x,y: if
x.equals(y) == true,如果x和y空:對(duì)于非空
x:x.equals(null) == false
高質(zhì)量等于方法:
使用 == 檢查參數(shù)是否是對(duì)該對(duì)象的引用 (
x == x)使用 instanceof 檢查參數(shù)是否是正確的類型(也檢查
null)將參數(shù)轉(zhuǎn)換為正確的類型
對(duì)于類中的每個(gè)“重要”字段,檢查參數(shù)的該字段是否與該對(duì)象的相應(yīng)字段匹配
完成后,檢查是否對(duì)稱、傳遞和一致
最后的警告:
覆蓋 equals 時(shí)始終覆蓋 hashCode
不要試圖太聰明
不要在 equals 聲明中用其他類型替換 Object -> 不值得為了增加復(fù)雜性而獲得輕微的性能提升
來自 Effective Java 2nd Edition 的Hashcode直接引用
在名為 result 的 int 變量中存儲(chǔ)一些常量非零值,例如 17。
對(duì)于
f對(duì)象中的每個(gè)重要字段(即 equals 方法考慮的每個(gè)字段),請(qǐng)執(zhí)行以下操作:計(jì)算字段的 int 哈希碼 c:
將步驟 2.a 中計(jì)算的哈希碼 c 合并到結(jié)果中,如下所示:
result = 31 * result + c;如果該字段是布爾值,則計(jì)算
(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),則對(duì)結(jié)果進(jìn)行哈希處理long。如果該字段是對(duì)象引用并且此類的 equals 方法通過遞歸調(diào)用比較該字段,則在該字段上
equals遞歸調(diào)用hashCode。如果需要更復(fù)雜的比較,請(qǐng)為此字段計(jì)算“規(guī)范表示”并在規(guī)范表示上調(diào)用 hashCode。如果字段的值為null,return 0(或其他一些常數(shù),但 0 是傳統(tǒng)的)。如果該字段是一個(gè)數(shù)組,則將其視為每個(gè)元素都是一個(gè)單獨(dú)的字段。也就是說,通過遞歸應(yīng)用這些規(guī)則來計(jì)算每個(gè)重要元素的哈希碼,并在步驟 2.b 中組合這些值。如果數(shù)組字段中的每個(gè)元素都很重要,則可以使用 1.5 版中添加的 Arrays.hashCode 方法之一。
返回結(jié)果。
當(dāng)你寫完 hashCode 方法后,問問自己相等的實(shí)例是否有相等的哈希碼。編寫單元測(cè)試來驗(yàn)證你的直覺!
所以遵循這些規(guī)則:
@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應(yīng)該已經(jīng)唯一地標(biāo)識(shí)任何人,所以您應(yīng)該只使用它進(jìn)行比較,而不是在任何子類中覆蓋它。
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果你想實(shí)現(xiàn) equals 和 hashcode 方法使用 eclipse 只需右鍵單擊文件轉(zhuǎn)到源并選擇 generate equals() & hashcode() 和你需要的字段,如下所示:


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