String a = "ab";
String b = "a" + "b";
System.out.println(a == b); // 輸出?
== 比較參考。+ 產生新物件,但未意識到編譯期優化。b 從池取得 "ab",但理由為「運行期計算後入池」——錯誤。"a" + "b" 為編譯期常量表達式,javac 直接優化為 "ab",位元碼等同 String b = "ab";,運行期無任何加法操作。javap -c Test.class 查看位元碼:
0: ldc #2 // String ab
2: astore_1
3: ldc #2 // String ab ← 同一常量池索引
5: astore_2
兩個 ldc 指向相同常量池項 #2,證明編譯期已合併。
String s1 = "a";
String s2 = "b";
String b = s1 + s2; // 運行期 new StringBuilder().append().toString(),產生新物件
System.out.println(a == b); // false
只有編譯期可確定的字串常量表達式才會折疊。