來自的文章
一、為什麼equals()方法要重寫?
判斷兩個物件在邏輯上是否相等,如根據類的成員變數來判斷兩個類的例項是否相等,而繼承object中的equals方法只能判斷兩個引用變數是否是同乙個物件。這樣我們往往需要重寫equals()方法。
我們向乙個沒有重複物件的集合中新增元素時,集合中存放的往往是物件,我們需要先判斷集合中是否存在已知物件,這樣就必須重寫equals方法。
二、怎樣重寫equals()方法?
public boolean equals(object obj)
}else if (!str1.equals(other.str1) )
return false;
} if(var1 != other.var1)
return false;
return true;
}
如果子類中增加了新特性,同時保留equals方法,這時比較複雜。
接下來我們通過例項來理解上面的約定。我們首先以乙個簡單的非可變的二維點類作為開始:
public class point
public boolean equals(object o)
} 假設你想要擴充套件這個類,為乙個點增加顏色資訊:
public class colorpoint extends point
//override equasl()
public boolean equals(object o)
} 我們重寫了equals方法,只有當實參是另乙個有色點,並且具有同樣的位置和顏色的時候,它才返回true。可這個方法的問題在於,你在比較乙個普通點和乙個有色點,以及反過來的情形的時候,可能會得到不同的結果:
public static void main(string args)
執行結果:
true
false
這樣的結果顯然違反了對稱性,你可以做這樣的嘗試來修正這個問題:讓colorpoint.equals在進行「混合比較」的時候忽略顏色資訊:
public boolean equals(object o)
這種方法的結果會怎樣呢?讓我們先來測試一下:
public static void main(string args)
執行結果:
true
true
true
false
這種方法確實提供了對稱性,但是卻犧牲了傳遞性(按照約定,p1.equals(p2)和p2.eqauals(p3)都返回true,p1.equals(p3)也應返回true)。要怎麼解決呢?
事實上,這是物件導向語言中關於等價關係的乙個基本問題。要想在擴充套件乙個可例項化的類的同時,既要增加新的特徵,同時還要保留
equals約定,沒有乙個簡單的辦法可以做到這一點。新的解決辦法就是不再讓colorpoint擴充套件point,而是在colorpoint中加入乙個私有的point域,以及乙個公有的檢視(view)
方法:
public class colorpoint
//返回乙個與該有色點在同一位置上的普通point物件
public point aspoint()
public boolean equals(object o)
}
還有另外乙個解決的辦法就是把
point設計成乙個抽象的類(abstract class),這樣你就可以在該抽象類的子類中增加新的特徵,而不會違反equals約定。因為抽象類無法建立類的例項,那麼前面所述的種種問題都不會發生。
重寫equals方法的要點:
1. 使用==操作符檢查「實參是否為指向物件的乙個引用」。
2.判斷實參是否為null
3. 使用instanceof操作符檢查「實參是否為正確的型別」。
4. 把實參轉換到正確的型別。
5. 對於該類中每乙個「關鍵」域,檢查實參中的域與當前物件中對應的域值是否匹
配。對於既不是float也不是double型別的基本型別的域,可以使用==操作符
進行比較;對於物件引用型別的域,可以遞迴地呼叫所引用的物件的equals方法;
對於float型別的域,先使用float.floattointbits轉換成int型別的值,
然後使用==操作符比較int型別的值;對於double型別的域,先使用
double.doubletolongbits轉換成long型別的值,然後使用==操作符比較
long型別的值。
6. 當你編寫完成了equals方法之後,應該問自己三個問題:它是否是對稱的、傳
遞的、一致的?(其他兩個特性通常會自行滿足)如果答案是否定的,那麼請找到
這些特性未能滿足的原因,再修改equals方法的**。
重寫equals方法
對於重寫equals方法有以下例子 object類中的常用方法。object類是所有類的根類,定義了所有物件都具備的功能。api 應用程式介面 文件 class person extends object 判斷是否是同齡人。這個方法也是在比較兩個person物件是否相等。注意 person類中是否有...
重寫equals方法
object物件中的 public boolean equals object obj 指示其他某個物件是否與此物件 相等 這裡的相等指的是比較的兩方指向同乙個物件 對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同乙個物件 就是同一塊記憶體位址 此方法才返回 true 但是這一性質並不符...
重寫equals方法
對稱性 如果x.equals y 返回是 true 那麼y.equals x 也應該返回是 true 自反性 x.equals x 必須返回是 true 傳遞性 如果x.equalsly 返回是 true 而且y.equals z 返回是 true 那麼z.equals x 也應該返回是 true ...