2月 24, 2011

使用 '==' 和 String.equals() 的不同

當比較兩個字串(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,因為這兩個物件所代表是同樣的字元序列。

沒有留言:

張貼留言