1. 程式人生 > >重寫object類equals方法(避免類中出現重複的資料)

重寫object類equals方法(避免類中出現重複的資料)

我們知道所有的物件都擁有標識(記憶體地址)和狀態(資料),同時“==”比較兩個物件的的記憶體地址,所以說使用Object的equals()方法是比較兩個物件的記憶體地址是否相等,即若object1.equals(object2)為true,則表示equals1和equals2實際上是引用同一個物件。雖然有時候Object的equals()方法可以滿足我們一些基本的要求,但是我們必須要清楚我們很大部分時間都是進行兩個物件的比較,這個時候Object的equals()方法就不可以了。
 定義Person類,屬性有name age sex  避免有重複資料錄入我們特此重寫object類中的equals方法。

重寫程式碼如下:

public boolean equals(Object obj) {
        //this代表本類
        if (this == obj) {
            return true;
        }
        // 判斷兩個物件屬性是不是相同
        if (obj instanceof Person) {
            //obj強制轉換Person類
            Person p = (Person) obj;
            //比較  == int型比較 
            if ((this.name.equals(p.name)) && (this
.age == p.age)&& (this.sex.equals(p.sex))) { return true; } } return false; }

在Java規範中,它對equals()方法的使用必須要遵循如下幾個規則:

  equals 方法在非空物件引用上實現相等關係:

 1、自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。

 2、對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。

  3、傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。

  4、一致性:對於任何非空引用值 x 和 y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改。

 5、 對於任何非空引用值 x,x.equals(null) 都應返回 false。  

  對於上面幾個規則,我們在使用的過程中最好遵守,否則會出現意想不到的錯誤。

  在java中進行比較,我們需要根據比較的型別來選擇合適的比較方式:

 1) 物件域,使用equals方法 。 
   2) 型別安全的列舉,使用equals或== 。 
  3) 可能為null的物件域 : 使用 == 和 equals 。 
 4) 陣列域 : 使用 Arrays.equals 。 
 5) 除float和double外的原始資料型別 : 使用 == 。 
 6) float型別: 使用Float.foatToIntBits轉換成int型別,然後使用==。  
  7) double型別: 使用Double.doubleToLongBit轉換成long型別,然後使用==。

至於6)、7)為什麼需要進行轉換,我們可以參考他們相應封裝類的equals()方法,下面的是Float類的:

public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }

原因:
然而,有兩個例外:如果f1和f2都代表自由浮動。南,那麼等於方法返回真的,即使Float.NaN = = Float.NaN假的有價值。
如果<程式碼> f1代表+ 0.0 ff2代表-0.0 f,或副平等的測試值假的,即使0.0 f = = -0.0 f有真正的價值。