String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2; // 編譯期常量折疊 -> "hello2"
String e = d + 2; // 運行期拼接 -> new StringBuilder().append("hello").append(2).toString()
System.out.println(a == c); // true
System.out.println(a == e); // false
final String b = "hello":編譯期確定值,屬於常量變量(Constant Variable,JLS 4.12.4)。b + 2 在編譯期被折疊為 "hello2",直接指向字符串常量池中同一對象。d 非 final,d + 2 在運行期通過 StringBuilder 創建新對象,地址不同。// 反編譯 class 文件可見
String c = "hello2"; // 直接常量
String e = new StringBuilder().append(d).append(2).toString(); // 運行期構建
