==和equals

==:

==: 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是是否相同,即是否是指的同一個對象。比較的是真正意義上的指針操作。
1. 比較的是操作符兩端的操作數是否是同一個對象。
2. 兩邊的操作數必須是同一類型(可以是父子類之間)才能編譯通過。
3. 比較的是地址,如果是具體的阿拉伯數字的比較,值想的則爲true。:
  int a = 10 與 long b = 10L 與 double c = 10.0 都是相同的(爲true),因爲他們都指向地址爲10的堆。

equals

  1. equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以用於所有的對象,如果沒有對該方法的覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是 == 的判斷。

  2. String s = “abcd”是一種非常特殊的形式,和new有本質的區別。它是java中唯一不需要new就可以產生對象的途徑。以String s = “abcd”;形式賦值在java中叫直接量,它是在常量池中而不是new一樣放在壓縮堆中。這種形式的字符串,在JVM內部發生字符串拘留,即當生命這樣的一個字符串後,JVM會在常量池中先查找有沒有一個值爲”abcd”的對象,如果有,就會把它賦給當前引用,即原來那個引用和現在的引用指向了同一對象,如果沒有,則在常量池中創建一個新的”abcd”,下一次如果有String s = “abcd”;又會將s指向”abcd”這個對象,即以這個形式生命的字符串,只要值相等,任何多個引用都指向同一個對象。

  3. 而String s = new String(“hello”);和其他任何對象一樣,每調用一次就產生一個對象,只要他們調用。

  4. 可以這麼理解:String str =”hello”;先在內存中找是不是有”hello”這對象,如果有,就讓str指向”hello”,如果內存裏沒有”hello”,就創建一個新的對象保存”hello”;String str = new String(“hello”);就不管是不是已經有”hello”這個對象,都新建一個對象保存”hello”。

具體我們看如下代碼:

public class He2 {

    public static void main(String[] args) {
        String a = new String("ab"); // a 爲一個引用,在內存中創建一個空間存儲"ab"對象
        String b = new String("ab"); // b爲另一個引用,在內存中創建另一個空間存儲"ab"對象。
        String aa = "ab"; // 放在常量池中(先在常量池中尋找是否有aa這個對象,如果沒有則創建)
        String bb = "ab"; // 從常量池中查找(上面已經創建了aa這個對象,所以就直接引用aa對象的地址值就可以了)
        if (aa == bb) { // true
            System.out.println("aa==bb");
            /*
            *     此時aa與bb相比較的是地址值,因爲aa與bb指向的是同一個地址值,所以aa == bb,
            *     地址值相同,值也相同。
            */
        }
        if (a == b) {// false,非同一對象a 與 b 都是開闢的新的內存空間存儲值,雖然值相等,但地址值不同(==號 比較的是地址值)。
            System.out.println("a==b");
        }
        if (a.equals(b)) {// true   , 比較的是引用的值是否相同(equals比較的是值是否相同。)
            System.out.println("aEQb");
        }
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

“==”比”equals”運行速度快,因爲“==”只比較地址值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章