String a = "ab";
String b = "a" + "b";
System.out.println(a == b); // true or false?
這道題常見的四種答案及其背後的思維軌跡:
== 比較的是引用。== 比較引用,以為 "a" + "b" 會在運行期創建新對象。b 會從池中獲取已存在的 "ab"。"a" + "b" 識別為常量表達式,編譯時直接優化為 "ab",問題退化為 String b = "ab"。編譯兩個類文件並用二進制編輯器對比:
// 版本 1
private String a = "aa";
// 版本 2
private String a = "a" + "a";
生成的 .class 文件完全一致,連一個字節都不差。證明運行期根本不存在 "a" + "a" 的拼接操作。
== 比較為 true。String bb = "b"; "a" + bb → bb 非常量,無法優化,結果 false。final String bb = "b"; "a" + bb → 編譯器識別為常量,優化為 true。final String bb = getBB(); → 無法優化,結果 false。Java 對 String 的優化近乎將其視為基本類型:+ 是 Java 唯一的「運算符重載」,編譯器與 JVM 合力將能優化的地方全部優化。理解這一機制,不僅能通過面試,更能避免生產環境中因誤解字符串拼接行為而導致的性能陷阱。