重寫object類equals方法(避免類中出現重複的資料)
阿新 • • 發佈:2019-02-16
我們知道所有的物件都擁有標識(記憶體地址)和狀態(資料),同時“==”比較兩個物件的的記憶體地址,所以說使用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有真正的價值。