Java中重寫equals方法的注意事項

一。 在重寫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方法的代碼。

 轉自 http://blog.csdn.net/ocree/article/details/6579085

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章