一。 在重寫equals方法時,要注意滿足離散數學上的特性
1 自反性:對任意引用值X,x.equals(x)的返回值一定為true.
2 對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false
二。 在重寫equals方法時,還要順手把 hashCode方法一起重寫了。
這一點主要是考慮和集合類協同工作的需要。一般集合為加快存取速度,通常使用類hashtable的方式存取對象,
hashCode() && equals() 則是判斷待查找元素與集合中某個元素相等的依據。 而java中默認的hashCode是
由對象的內存地址生成的, 如果重寫了equals 而 重寫 hashCode, 則會造成“A和B相等,A加入集合后,用B查詢集合卻查不到”的悖論。
當然了,以上只是約束條件,關鍵還是要符合自己設計的初衷,把最起碼的相等判別邏輯給無視了。
三。重寫equals方法的一般步驟:
1. 使用==操作符檢查“實參是否為指向對象的一個引用”。
2. 使用instanceof操作符檢查“實參是否為正確的類型”。
3. 把實參轉換到正確的類型。
4. 對於該類中每一個“關鍵”域,檢查實參中的域與當前對象中對應的域值是否匹 配。
a。對於既不是float也不是double類型的基本類型的域,可以使用==操作符進行比較(why?);
b。對於對象引用類型的域,可以遞歸地調用所引用的對象的equals方法;
c。對於float類型的域,先使用Float.floatToIntBits轉換成int類型的值, 然后使用==操作符比較int類型的值;
d。對於double類型的域,先使用Double.doubleToLongBits轉換成long類型的值,然后使用==操作符比較long類型的值。
5. 當你編寫完成了equals方法之后,應該問自己三個問題:它是否是對稱的、傳
遞的、一致的?(其他兩個特性通常會自行滿足)如果答案是否定的,那么請找到
這些特性未能滿足的原因,再修改equals方法的代碼。