equals和==的區(qū)別小結(jié)

==

==比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)對(duì)象。比較的是真正意義上的指針操作。

  1. 比較的是操作符兩端的操作數(shù)是否是同一個(gè)對(duì)象。
  2. 兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過(guò)。
  3. 比較的是地址,如果是具體的阿拉伯?dāng)?shù)字的比較,值相等則為true。如:int a=10long b=10Ldouble c=10.0都是相同的(為true),因?yàn)樗麄兌贾赶虻刂窞?0的堆。

equals

equals用來(lái)比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對(duì)象,如果沒(méi)有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。

String s="abce"是一種非常特殊的形式,和new有本質(zhì)的區(qū)別。它是java中唯一不需要new就可以產(chǎn)生對(duì)象的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是像new一樣放在壓縮堆中。這種形式的字符串,在JVM內(nèi)部發(fā)生字符串拘留,即當(dāng)聲明這樣的一個(gè)字符串后,JVM會(huì)在常量池中先查找有沒(méi)有一個(gè)值為"abcd"的對(duì)象,如果有,就會(huì)把它賦給當(dāng)前引用,即原來(lái)那個(gè)引用和現(xiàn)在這個(gè)引用指向了同一對(duì)象,如果沒(méi)有,則在常量池中新創(chuàng)建一個(gè)"abcd",下一次如果有String s1 = "abcd";又會(huì)將s1指向"abcd"這個(gè)對(duì)象,即以這種形式聲明的字符串,只要值相等,任何多個(gè)引用都指向同一對(duì)象。
String s = new String("abcd");和其它任何對(duì)象一樣,每調(diào)用一次就產(chǎn)生一個(gè)對(duì)象,只要它們調(diào)用。

也可以這么理解:String str = "hello";先在內(nèi)存中找是不是有"hello"這個(gè)對(duì)象,如果有,就讓str指向那個(gè)"hello"。如果內(nèi)存里沒(méi)有"hello",就創(chuàng)建一個(gè)新的對(duì)象保存"hello"。String str=new String("hello")就是不管內(nèi)存里是不是已經(jīng)有"hello"這個(gè)對(duì)象,都新建一個(gè)對(duì)象保存"hello"。

具體可以看下面的代碼:

public class EqualsTest {
    public static void main(String[] args) {
        String a = new String("ab"); // a為一個(gè)引用
        String b = new String("ab"); // b為另一個(gè)引用,對(duì)象的內(nèi)容一樣
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 從常量池中查找
        if (aa == bb) { // true
            System.out.println("aa==bb");
        }
        if (a == b) { // false,非同一對(duì)象
            System.out.println("a==b");
        }
        if (a.equals(b)) { // true
            System.out.println("aEQb");
        }
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

equals和==的區(qū)別

equals方法最初是在所有類的基類Object中進(jìn)行定義的,源碼是:

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

由equals的源碼可以看出這里定義的equals與==是等效的(Object類中的equals沒(méi)什么區(qū)別),不同的原因就在于有些類(像String、Integer等類)對(duì)equals進(jìn)行了重寫,但是沒(méi)有對(duì)equals進(jìn)行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非我們?cè)诖祟愔兄貙慹quals。

對(duì)equals重新需要注意五點(diǎn):

  1. 自反性:對(duì)任意引用值x,x.equals(x)的返回值一定為true;
  2. 對(duì)稱性:對(duì)于任何引用值x和y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時(shí),x.equals(y)的返回值一定為true;
  3. 傳遞性:如果x.equals(y)=true,y.equals(z)=true,則x.equals(z)=true;
  4. 一致性:如果參與比較的對(duì)象沒(méi)任何改變,則對(duì)象比較的結(jié)果也不應(yīng)該有任何改變;
  5. 非空性:任何非空的引用值x,x.equals(null)的返回值一定為false 。

String類對(duì)equals的重寫如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

另外,"=="比"equals"運(yùn)行速度快,因?yàn)?=="只是比較引用。

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

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

  • == == 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)...
    yeren108閱讀 317評(píng)論 0 0
  • ==: == 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一...
    CQ_TYL閱讀 300評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,692評(píng)論 18 399
  • 明天清晨要趕飛機(jī),意料之中的,又失眠了,算了一下,還有五個(gè)小時(shí)可以休息,不睡也罷。 記憶中第一次...
    橋玄閱讀 389評(píng)論 2 5

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