自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

終結(jié)篇:==和equals有什么區(qū)別?

開(kāi)發(fā) 前端
對(duì)于 Object 來(lái)說(shuō),equals 是用 == 實(shí)現(xiàn)的,所以二者是相同的,都是用來(lái)比較兩個(gè)對(duì)象的引用是否相同的,但 Java 中的其他類,都會(huì)重寫(xiě) equals 讓其變?yōu)橹当容^,而非引用比較,如 Integer 和 String 都是這樣。

== 和 equals 有什么區(qū)別?這個(gè)問(wèn)題本身不難,但是被問(wèn)到的頻率很高,且大部分人的回答都不夠全面,讓人聽(tīng)了有種“恨鐵不成鋼”的感覺(jué),所以今天咱們就來(lái)好好聊聊這個(gè)問(wèn)題。

1.典型回答

對(duì)于 Object 來(lái)說(shuō),其 equals 方法底層實(shí)現(xiàn)就是“==”,如下 JDK 的 Object 源碼如下:

public boolean equals(Object obj) {
return (this == obj);
}

也就是說(shuō),對(duì)于 Object 對(duì)象來(lái)說(shuō),equals 和 == 都是一樣的,都是比較對(duì)象的引用是否相同。但是,在 JDK 中的其他類中通常會(huì)重寫(xiě) equals 以實(shí)現(xiàn)具體的值比較,例如 Integer 中的 equals 和 String 中的 equals 等,如下源碼所示。 Integer 中的 equals 實(shí)現(xiàn)源碼如下:

public boolean equals(Object obj) {
if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
}
return false;
}

從上述源碼可以看出,Integer 中會(huì)先將 Integer 對(duì)象轉(zhuǎn)換成基礎(chǔ)類型 int 值來(lái)進(jìn)行比較,所以此時(shí)就不再是對(duì)比兩個(gè)對(duì)象的引用了,而是對(duì)比兩個(gè)對(duì)象的值是否相等。 String 中的 equals 實(shí)現(xiàn)源碼如下:

public boolean equals(Object anObject) {
if (this == anObject) { // 引用相同返回 true,引用相同,那么值肯定相同了
    return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value); // equals 為下面的 equals 方法
}
@IntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
    if (value.length == other.length) {
        for (int i = 0; i < value.length; i++) { // 循環(huán)每個(gè)字符對(duì)比,本質(zhì)是值比較
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

從 String 中的 equals 中可以看出,它和 Integer 一樣,是將 Object 中的引用比較重寫(xiě)成了值比較了。

2.考點(diǎn)分析

所以,對(duì)于 Object 來(lái)說(shuō),== 和 equals 都是一樣的,都是用來(lái)對(duì)比兩個(gè)對(duì)象的引用是否相同的,而其他 Java 中的類中,如 String 或 Integer 等,通常都會(huì)重寫(xiě) equals 讓其變?yōu)楸容^具體的值是否相同,而非引用是否相同。 所以,我們通常會(huì)使用 == 來(lái)對(duì)比兩個(gè)對(duì)象的引用是否相同,而使用 equals 對(duì)比兩個(gè)值是否相同(前提條件是重寫(xiě)了 equals 方法)。

3.知識(shí)擴(kuò)展

如果我們自定義一個(gè)類,并且想和 Integer 或 String 中的 equals 一樣,用其對(duì)比值而非引用是否相同的實(shí)現(xiàn)代碼如下:

public class Person {
    private String name;
    private int age;
    // 忽略構(gòu)造方法和 Getter、Setter 方法......
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return this.age == other.age && this.name.equals(other.name);
    }
}

小結(jié)

對(duì)于 Object 來(lái)說(shuō),equals 是用 == 實(shí)現(xiàn)的,所以二者是相同的,都是用來(lái)比較兩個(gè)對(duì)象的引用是否相同的,但 Java 中的其他類,都會(huì)重寫(xiě) equals 讓其變?yōu)橹当容^,而非引用比較,如 Integer 和 String 都是這樣。


責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2021-12-17 14:40:02

while(1)for(;;)語(yǔ)言

2024-03-05 18:59:59

前端開(kāi)發(fā)localhost

2022-08-02 08:23:37

SessionCookies

2024-05-27 00:40:00

2022-02-27 15:33:22

安全CASBSASE

2024-09-09 13:10:14

2021-05-16 14:26:08

RPAIPACIO

2020-03-09 20:56:19

LoRaLoRaWAN無(wú)線技術(shù)

2022-09-07 18:32:57

并發(fā)編程線程

2020-11-09 14:07:53

PyQtQt編程

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-08-31 08:33:54

Bash操作系統(tǒng)Linux

2022-08-22 07:06:32

MyBatisSQL占位符

2025-03-10 09:30:00

SpringJava開(kāi)發(fā)

2018-07-20 14:00:51

LinuxmacOS內(nèi)核

2012-10-18 14:46:01

Windows RTWindows 8

2024-02-26 07:36:09

lockJava語(yǔ)言

2016-12-07 19:55:33

大數(shù)據(jù)深度學(xué)習(xí)

2022-03-14 10:26:23

云計(jì)算物聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)