2009年4月22日 星期三

==和 java.lang.String.equals()的不同

因為有時判斷的時候明明==的意思是正確的,但是依然會出現錯誤,所以我就放上這一篇做參考
轉載自:http://www.javaworld.com.tw/jute/post/view?bid=29&id=9578&sty=3&age=0&tpg=1&ppg=1


當比較兩個字串(String)時,使用 '==' 運算子和 java.lang.String.equals()這個
method有什麼不同呢?

'=='這個運算子會看看這兩個字串的references是不是指向同一個字串object。而
java.lang.String.equals()這個method則會比較這兩個字串的"值"是不是一樣的。換句
話說,比較這兩個字串是不是有相同的字元序列。

當使用String literals(一串被雙引號括住的字元)時,使用 '=='運算子和使用equals
method 的結果會是一樣的。所有的String literals都是指向同一個String 類別的
instances。系統中有一個pool,當有新的String literals出現時,系統會先去檢查pool
之中,是不是已經存在一個和這個新的String literals有相同內容的物件。如果存在,
則會傳回一個指向這個此物件的reference。若不存在,則會將此String literals放到
pool中,然後傳回這個物件的reference。

舉個例子:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"這個關鍵字所造出來的時候,則不是這麼一回事。

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

傳用"new"這個關鍵字時,會造出兩個不同的物件,所以會有兩個不同的references,即
使在底層的string literal是一樣的。在上面的例子中,'=='運算子傳回false,因為兩
個references是不同的。而equals method則傳回true,因為這兩個物件所代表是同樣的
字元序列。

沒有留言:

張貼留言