==與equals的區別(全網最詳細


==與equals的區別

我們先看Demo

  	String str = "abc";
        String str1 = "abc";
        String abc = new String("abc");
        String abc1 = new String("abc");

然后我們使用==和equals挨個輸出

System.out.println(str==str1);// true
System.out.println(abc==abc1);//false

這里 str==str1,結果為true,因為String str = "abc"在編譯的時候,jvm將abc放入常量池,並在常量池中創建該常量的地址,然后將str去指向這個常量,當我們執行String str1 = "abc"的時候,會去常量池中尋找有沒有abc這個常量,如果有,則將str1指向它,沒有就創建,所以str1和str都指向常量池中的abc,故內存地址相同。

而在 String abc = new String("abc")中,首先會在堆內存中去開辟一個空間去存儲abc,當我們再new對象的時候,還會再去開辟,所以二則的內存地址不相同,故返回false

然后再看equals輸出:

 System.out.println(abc.equals(abc1));// true
 System.out.println(str.equals(abc));// true

當我們使用equals時,從上面講的,可以知道abc與abc1,str與abc的內存地址並不相同,其在值上是相同的,那么可以得出結論equals會用==比較兩個類型在內存中的地址一不一樣,如果一樣,則直接返回true,如果不一樣,則直接往下走,再判斷是否為string類型,如果不是,則強轉為string類型,再將字符串數組拆分為單個字符,一一比較,有一個不相同,則返回false,否則返回true

總結:

==對於基本類型,比較的是值,但對於引用類型,比較的是內存地址

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會用==比較兩個類型在內存中的地址一不一樣,如果一樣,則直接返回true,如果不一樣,則直接往下走,再判斷是否為string類型,如果不是,則強轉為string類型,再將字符串數組拆分為單個字符,一一比較,有一個不相同,則返回false,否則返回true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM