2009-02-24

Java 語言字串比較 equals 與 ==

Java語言也許是物件導向(OO)化的原因, 比較 string 時有點複雜. String Object的value不能用 '==' 去比,一定要用equals()才行.

'=='運算子比較是否同一物件 Object.

equals method 則是比較內容是否相同.

使用String literals(雙引號括住的字串)時,使用 '=='運算子和使用equals method 的結果會是一樣的。

所有的String literals都是指向同一個String 類別的instances。JVM中有個pool,當有新的String literals出現時,系統會先去檢查pool 之中,是不是已經存在一個和這個新的String literals有相同內容的物件。如果存在,則會傳回指向這個此物件的reference。若不存在,則會將此String literals放到pool中,然後傳回這個物件的reference。

Sample:
String s1 = "ABC";
String s2 = "AB"+"C";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"關鍵字所造出來的則不同。

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

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