成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

終結篇:==和equals有什么區別?

開發 前端
對于 Object 來說,equals 是用 == 實現的,所以二者是相同的,都是用來比較兩個對象的引用是否相同的,但 Java 中的其他類,都會重寫 equals 讓其變為值比較,而非引用比較,如 Integer 和 String 都是這樣。

== 和 equals 有什么區別?這個問題本身不難,但是被問到的頻率很高,且大部分人的回答都不夠全面,讓人聽了有種“恨鐵不成鋼”的感覺,所以今天咱們就來好好聊聊這個問題。

1.典型回答

對于 Object 來說,其 equals 方法底層實現就是“==”,如下 JDK 的 Object 源碼如下:

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

也就是說,對于 Object 對象來說,equals 和 == 都是一樣的,都是比較對象的引用是否相同。但是,在 JDK 中的其他類中通常會重寫 equals 以實現具體的值比較,例如 Integer 中的 equals 和 String 中的 equals 等,如下源碼所示。 Integer 中的 equals 實現源碼如下:

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

從上述源碼可以看出,Integer 中會先將 Integer 對象轉換成基礎類型 int 值來進行比較,所以此時就不再是對比兩個對象的引用了,而是對比兩個對象的值是否相等。 String 中的 equals 實現源碼如下:

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++) { // 循環每個字符對比,本質是值比較
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

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

2.考點分析

所以,對于 Object 來說,== 和 equals 都是一樣的,都是用來對比兩個對象的引用是否相同的,而其他 Java 中的類中,如 String 或 Integer 等,通常都會重寫 equals 讓其變為比較具體的值是否相同,而非引用是否相同。 所以,我們通常會使用 == 來對比兩個對象的引用是否相同,而使用 equals 對比兩個值是否相同(前提條件是重寫了 equals 方法)。

3.知識擴展

如果我們自定義一個類,并且想和 Integer 或 String 中的 equals 一樣,用其對比值而非引用是否相同的實現代碼如下:

public class Person {
    private String name;
    private int age;
    // 忽略構造方法和 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);
    }
}

小結

對于 Object 來說,equals 是用 == 實現的,所以二者是相同的,都是用來比較兩個對象的引用是否相同的,但 Java 中的其他類,都會重寫 equals 讓其變為值比較,而非引用比較,如 Integer 和 String 都是這樣。


責任編輯:武曉燕 來源: Java中文社群
相關推薦

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-11-09 14:07:53

PyQtQt編程

2021-12-17 14:40:02

while(1)for(;;)語言

2022-02-27 15:33:22

安全CASBSASE

2024-05-27 00:40:00

2021-05-16 14:26:08

RPAIPACIO

2022-08-02 08:23:37

SessionCookies

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開發localhost

2022-08-31 08:33:54

Bash操作系統Linux

2022-08-22 07:06:32

MyBatisSQL占位符

2025-03-10 09:30:00

SpringJava開發

2022-01-16 07:46:53

SpringDataASSM

2022-08-03 07:04:56

GETHTTPPOST

2021-03-27 10:56:17

promisethenfinally

2023-01-19 17:51:19

apt removeapt purge

2020-06-28 15:11:07

LoRaWAN網絡專用網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线精品 | 91久久久久久久 | 欧美在线视频免费 | 精品亚洲91 | 亚洲高清在线免费观看 | 99热国产在线播放 | 欧美猛交 | 九九热在线视频观看这里只有精品 | 人人九九精 | 国产免费让你躁在线视频 | 一级片在线观看 | 久久久激情视频 | 久久久久国产一区二区三区四区 | 色一情一乱一伦一区二区三区 | 四虎永久免费黄色影片 | 黄色男女网站 | 中文在线视频观看 | 国产不卡视频在线 | 91精品国产91久久久久久吃药 | 国产一区二区视频在线 | 美女黄视频网站 | 91麻豆精品国产91久久久久久 | 精品96久久久久久中文字幕无 | 久久一区精品 | 亚洲第一黄色网 | 国产精品久久久久久久免费观看 | 久久亚洲一区二区三区四区 | 东京久久 | 在线观看国产视频 | 久久人人网 | 亚洲精品电影在线观看 | 国产九九九 | 精品欧美乱码久久久久久1区2区 | 99热.com| 国产精品永久久久久久久www | 亚洲国产黄色av | 色综合视频 | 国产乱码精品1区2区3区 | 一级黄色裸片 | 欧美精品在线一区 | 精品国产一区二区三区性色 |