2017年3月26日 星期日

[Java] equals 與 == 的差異

前言:

通常我們從後台取得 json 資料後都會轉成 String ,並解析其參數值拿來使用,而在使用前最好先判斷參數值是否存在或相同再做解析,這樣可以避免不可預期的錯誤(有可能資料本身就沒有帶到參數或參數打錯字等...)。而這時候大多數人都會想到用 == 或 Sting.equals()來做判斷,不過他們還是有些差異唷,以下我會用一些範例來說明 == 或 Sting.equals() 的差異。
ps:可以的話(String pool)的觀念也要知道一下會比較好,良葛哥學習筆記字串特性中有提到也寫得很不錯可以參考看看)。


1.==
== 其實是在判斷 stack 內的值,當兩個參考資料型別變數指向同一物件, == 運算子的結果會為 true; 且若兩個參考資料型別變數指向不同物件時,結果為 false。


2.equals
String 類別有提供 equals 這個方法如下方程式碼,先比較兩物件是否為相同類型的類別後在比較其內容值是否相同,是就回傳 true,否則回傳 false。

String.java
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;
    }



程式範例如下:
package pkg;

public class Main {

    public static void main(String[] args) {
        String s4 = new String("restful");
        String s5 = new String("restful");
        String s6 = new String("peaceful");
        String s7 = s4;
        String s8 = "restful";
        String s9 = "restful";
        
        System.out.println(s4.equals(s5)); //s4和s5所帶的值相同---true
        System.out.println(s4.equals(s6)); //s4和s6所帶的值不相同----false
        System.out.println(s4 == s5); //s4和s5各new了不同的記憶體空間----false
        System.out.println(s4 == s7); //因為把s7指向了和s4所指向的同一個空間----true
        System.out.println(s4 == s8); //因為s4 new了一個新空間,而s8則在字串池中---false
        System.out.println(s8 == s9); 
        //s8和s9都在字串池中,為了節省記憶體空間,在字串池中,只要值相同,都會指向同一個記憶體空間-----true
    }

}



沒有留言:

張貼留言

[java] 條件控制

前言: 在 java 的條件控制中可分為 if-else 架構、三元運算子、switch-case 架構這三類,其中 if-else、三元運算子為條件型的判斷,條件必須為 true/false布林值;switch-case 為比對變數型的判斷,條件值比較多可以是 char、...