equals方法重寫

2021-07-24 22:30:57 字數 2447 閱讀 8008

來自的文章

一、為什麼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 ...