(面試)在聊Java中的equals方法

java規(guī)范中equals方法特征

自反性(對于任何非空引用x, x.equals(x) 返回true;)

對稱性(對于任何引用x, y, 當且僅當y.equals(x) 返回true, x.equals(y)返回true;)

傳遞性(對于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 則 x.equals(z)返回true;)

一致性(若x和y引用的對象沒有發(fā)生改變, 則反復調(diào)用x.equals(y)應該返回同樣的結(jié)果.)

對任意非空引用x, x.equals(null) 返回false;

通過下面的例子掌握equals的用法

package org.java.base.equals;

public class TestEquals {

public static void main(String[] args) {

/**

* 這里使用構(gòu)造方法Cat()在堆內(nèi)存里面new出了兩只貓,

* 這兩只貓的color,weight,height都是一樣的,

* 但c1和c2卻永遠不會相等,這是因為c1和c2分別為堆內(nèi)存里面兩只貓的引用對象,

* 里面裝著可以找到這兩只貓的地址,但由于兩只貓在堆內(nèi)存里面存儲在兩個不同的空間里面,

* 所以c1和c2分別裝著不同的地址,因此c1和c2永遠不會相等。

*/

Cat c1 = new Cat(1, 1, 1);

Cat c2 = new Cat(1, 1, 1);

System.out.println(“c1==c2的結(jié)果是:”+(c1==c2));//false

System.out.println(“c1.equals(c2)的結(jié)果是:”+c1.equals(c2));//false

}

}

class Cat {

int color, weight, height;

/**

* 定義一只貓

* @param color–顏色

* @param weight–重量

* @param height–高度

*/

public Cat(int color, int weight, int height) {

this.color = color;

this.weight = weight;

this.height = height;

}

}

輸出的結(jié)果如下:

c1==c2的結(jié)果是:false

c1.equals(c2)的結(jié)果是:false


 c1指向一個對象,c2也指向一個對象,c1和c2里面裝著的是這兩只Cat對象在堆內(nèi)存里面存儲的地址,由于這兩只Cat對象分別位于不同的存儲空間,因此c1和c2里面裝著的地址肯定不相等,因此c1和c2這兩個引用對象也肯定不相等。因此執(zhí)行:“System.out.println(c1==c2);”打印出來的結(jié)果肯定是false。因此你new出來了兩個對象,你放心,這兩個對象的引用永遠不一樣,一樣的話就會把其中一個給覆蓋掉了,這個可不成。c1是不是等于c2比較的是c1和c2這兩個引用里面裝著的內(nèi)容,因為new出來的兩個對象的它們的引用永遠不一樣,因此c1和c2這兩個引用的內(nèi)容也永遠不一樣,因此c1永遠不可能等于c2。因此通過比較兩個對象的引用是永遠無法使得兩個對象相等的,一模一樣的。

  要想判斷兩個對象是否相等,不能通過比較兩個對象的引用是否相等,這是永遠都得不到相等的結(jié)果的,因為兩個對象的引用永遠不會相等,所以正確的比較方法是直接比較這兩個對象,比較這兩個對象的實質(zhì)是不是一樣的,即這兩個對象里面的內(nèi)容是不是相同的,通過比較這兩個對象的屬性值是否相同而決定這兩個對象是否相等。

  Object類提供了一個equals()方法來比較兩個對象的內(nèi)容是否相同,因此我們可以采用這個方法去比較兩個對象是否在邏輯上“相等”。如:c1.equals(c2);這里是調(diào)用從Object類繼承下來的equals()方法,通過查閱API文檔得到Object類里的equals方法的定義如下:

public boolean equals(Object obj)

  在Object這個類里面提供的Equals()方法默認的實現(xiàn)是比較當前對象的引用和你要比較的那個引用它們指向的是否是同一個對象,即和“c1==c2”這種寫法是一樣的,“c1.equals(c2)”與“c1==c2”是完全等價的。因此直接使用繼承下來的equals()方法也是無法直接比較兩個對象的內(nèi)容是否相同的,為此,我們必須得重寫equals()方法,改變這個方法默認的實現(xiàn)。

public boolean equals(Object obj){

if (obj==null){

return false;

}

else{

/**

* instanceof是對象運算符。

* 對象運算符用來測定一個對象是否屬于某個指定類或指定的子類的實例。

* 對象運算符是一個組合單詞instanceof。

* 該運算符是一個雙目運算符,其左邊的表達式是一個對象,右邊的表達式是一個類,

* 如果左邊的對象是右邊的類創(chuàng)建的對象,則運算結(jié)果為true,否則為false。

*/

if (obj instanceof Cat){

Cat c = (Cat)obj;

if (c.color==this.color && c.weight==this.weight && c.height==this.height){

return true;

}

}

}

return false;

}

這一次得到的結(jié)果就與上次沒有重寫equals()方法時得到的結(jié)果就不一樣了:

c1==c2的結(jié)果是:false

c1.equals(c2)的結(jié)果是:true

  “System.out.println(c1 == c2);”打印出來的結(jié)果依然是false,因為這里是比較兩個對象的引用里面的內(nèi)容,這兩個引用里面的內(nèi)容當然不相等,而且永遠不會相等,所以打印出來的結(jié)果肯定是false。

  “System.out.println(c1.equals(c2));”打印出來的結(jié)果為true,因為我們在Cat類里面重寫了equals()方法,改變了這個方法默認的實現(xiàn),我們把方法的實現(xiàn)改為只要這個兩個對象是真的存在,并且都是貓,并且它們的顏色(color),身高(height)和體重(weight)都相同,那么這兩只貓在邏輯上就是一模一樣的,是完全相同的兩只貓,即這兩只貓是“相等”的。所以這里打印出來的結(jié)果是true。

1.3.如何比較兩個字符串對象是否相等?


在String類里面是這樣重寫equals()方法的實現(xiàn)的:用當前的這個字符串對象和指定的字符串對象比較,指定的字符串對象不能為空并且這個對象的字符序列和當前這個字符串對象的字符串序列一樣,如果這些條件都滿足,那么這兩個字符串對象就是相等的。

總結(jié):比較兩個對象是否相等,我們采用equals()方法,判斷兩個對象是否相等的條件是由我們重寫equals()方法的實現(xiàn)后定義的,這樣就可以比較靈活地使用equals()方法在不同的類里面比較位于同一類下的兩個對象是否相等了。

有興趣的朋友可以加947405150? 一起吹b交流!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容