關於java對象的 == 和 equals()方法的誤解

對於java 的 == 和equals()方法,在網上看到這樣一段描述:java

值類型是存儲在內存中的堆棧(之後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其自己則存儲在堆中。this

    ==操做比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。spa

 

equals操做表示的兩個變量是不是對同一個對象的引用,即堆中的內容是否相同。code

    ==比較的是2個對象的地址,而equals比較的是2個對象的內容。對象

    顯然,當equals爲true時,==不必定爲true;繼承

        注意加粗的那兩句話,實際上是有問題的,爲何?下面咱們來看看。內存

        對於equals方法來講,在Object類裏是這樣的:字符串

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

        能夠看到這裏 equals和==是等價的!!class

       那麼爲何會出現== 和equals獲得不一樣結果的現象呢?還記得java面向對象的特性嗎?多態,怎樣實現多態?要有繼承,要有重寫。沒錯,就是重寫!對於equals方法能獲得什麼結果,要看子類裏equals方法的具體實現是什麼。好比,在String類裏是這樣的:變量

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;
    }

       首先看==是否爲真,若是爲真則表示是指向的同一個堆地址,所以確定是一個對象,認爲相等,返回 true。

       若是不是一個對象,則再判斷要比較的對象是不是String類型,若是根本不是String類型,則直接認爲不等,返回false,若是是String類型,再逐個判斷字符串內的字符是否一致,注意這裏比較的是基本類型char的值,也就是判斷String的內容是否一致。

       總結:對於對象的equals方法返回值,要看對象類對該方法的具體實現,若是沒有重寫該方法,則和==的返回結果一致!

相關文章
相關標籤/搜索