public class CompareString {
public static void main(String[] args) {
String a = new String();
String aa = "";
String aaa = new String("");
String b = new String("asdf");
String c = new String("asdf");
String d = "asdf";
System.out.println(a == aa);
System.out.println(a == aaa);
System.out.println(a.intern() == aa.intern());
System.out.println(a.intern() == aaa.intern());
System.out.println(d == "asdf");
System.out.println(b == c);
System.out.println(b == d);
System.out.println(b.equals(c));
System.out.println(b.equals(d));
b = b.intern();
System.out.println(b == c);
System.out.println(b == d);
c = c.intern();
System.out.println(b == c);
}
}
以上程序的運行結果爲:
false
false
true
true
true
false
false
true
true
false
true
true
從運行結果可以驗證前面所述的內容。如果不懂String 類的intern()方法的用法可以參考jdk自帶的文檔:
public String intern()
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification
Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
從CompareString類中我們也可以看出==與equals()的不同之處:即==比較的是兩個對象的引用(即內存地址)是否相等,而equals()比較的是兩個對象的值(即內存地址裏存放的值)是否相等。當然equals()在個別類中被重寫了那就例外了。