1. 程式人生 > >JAVA Android 字串是否相等使用equals方法

JAVA Android 字串是否相等使用equals方法

1 總體來說java中字串的比較是==比較引用,equals 比較值的做法。(equals 對於其他引用型別比較的是地址,這是因為object的equals方法比較的是引用),但是不同的宣告方法字串的比較結果也是不同的。
    例如:  String str1=new String("a");
        String str2=new String("a");
        str1==str2  輸出false
        str1.equals(str2)  輸出true
    而如果這樣宣告  
        String str1="a";
        String str2="a";


        str1==str2  輸出true
        str1.equals(str2)  輸出true
  這是因為 equals 方法本來也是比較引用的 字串類在實現的時候重寫了該方法, 第一種宣告方法等於是聲明瞭兩個物件,用’==‘比較是時候比較的是引用輸出的是false 由於他們的值相同用equals的時候就比較的是值了,輸出true。 
而第二種情況不是因為比較有與第一種有差異,而是因為宣告有差異,第二種宣告方法在宣告的時候有堆或堆疊 共用的現象,也就是說 在宣告的時候如果如果宣告為類屬性他會檢查在堆疊中有沒有與現在宣告的是相同結構的字串。如果有就直接將地址指向已有記憶體地址。宣告在方法內部的區域性變數原理一樣只不過他是堆疊共享。

    對應上面是示例:
    第一種情況:(1)  宣告一個string型別的物件 str1,這個操作會在記憶體中示例化一個string型別的物件。
            (2) 再宣告一個String型別的物件str2,這個操作會在記憶體中示例化另一個String型別的物件,與第一個物件相互獨立。
        (3)比較兩個物件的引用,因為他們是相互獨立的所以輸出false
        (4)比較兩個物件的值,他們雖然是獨立的記憶體區域但是有共同的記憶體結構(值),輸出true
    第二種情況:(1)宣告一個字串str1 會示例化一個String型別的物件。
            (2)宣告另一個字串 ,現在會檢查在同一作用域中有沒有相同的記憶體結構的變數,如果有就直接將將地址指向他。

            (3)==比較他們有相同的地址,
            (4)equals比較他們有相同的記憶體結構(值)。

判斷字串相等我們經常習慣性的寫上if(str1==str2),這種寫法在java中可能會帶來問題。

java中判斷字串是否相等有兩種方法:

1、用“==”運算子,該運算子表示指向字串的引用是否相同,比如: String a="abc";String b="abc",

那麼a==b將返回true。這是因為在java中字串的值是不可改變的,相同的字串在記憶體中只會存

一份,所以a和b指向的是同一個物件;再比如:String a=new String("abc"); String b=new String("abc");

那麼a==b將返回false,因為a和b指向不同的物件。

2、用equals方法,該方法比較的是字串的內容是否相同,比如:String a=new String("abc"); 

String b=new String("abc"); a.equals(b);將返回true。所以通常情況下,為了避免出現上述問題,判斷

字串是否相等使用equals方法。