2013-05-22 66 views
7

我想了解字符串常量池,字符串文字對象在常量池管理,我不能夠理解爲什麼我從下面的代碼獲得false其中s2 == s4如何創建字符串文字?

public static void main(String[] args) { 
    String s1 = "abc"; 
    String s2 = "abcd"; 
    String s3 = "abc" +"d"; 
    String s4 = s1 + "d"; 
    System.out.println(s2 == s3); // OP: true 
    System.out.println(s2 == s4); // OP: false 
} 
+3

「abc」+「d」是編譯時常量表達式,而s1 +「d」不是。 – johnchen902

回答

12

表達"abc" + "d"是常量表達式,因此串接在編譯時執行,導致編碼等效於:

String s1 = "abc"; 
String s2 = "abcd"; 
String s3 = "abcd"; 
String s4 = s1 + "d"; 

表達s1 + "d"是一個常量表達式,因此在執行時執行時,創建一個新的字符串對象。因此,儘管s2s3引用了相同的字符串對象(由於字符串常量內部實現),但s2s4引用了不同(但相同)的字符串對象。

有關常量表達式的更多詳細信息,請參閱section 15.28 of the JLS

+0

喬恩 - 我已經解決了我認爲在結語中的疏忽。這將是很好的檢查,這是你真正的意思。 –

+0

@AndrzejDoyle:是的,這是 - 謝謝。 –

+4

另請注意,如果您最終確定's1',那麼第二次比較也會輸出'true',因爲在編譯時它會被視爲常量。 –

0

s2在編譯時創建。內存爲它保留並相應地填充。

s1 + "d"在運行時進行評估。由於您使用的是兩個不同的字符串(即s1是一個理論上可能是變量的變量),因此編譯器無法預先知道您不打算更改對象引用的值。

因此,它必須動態分配內存。