首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 編譯器對 String 常量表達式的優化深度解析:為什麼 "a" + "b" == "ab" 是 true?

     編輯:Java 相關知識

經典面試題:這段代碼輸出什麼?

String a = "ab";
String b = "a" + "b";
System.out.println(a == b); // true or false?

這道題常見的四種答案及其背後的思維軌跡:

  1. true(新手視角):認為內容相同即相等,忽略了 == 比較的是引用。
  2. false(進階視角):知道 == 比較引用,以為 "a" + "b" 會在運行期創建新對象。
  3. true(高手視角):知曉字符串常量池,認為 b 會從池中獲取已存在的 "ab"。
  4. true(真相視角):編譯期優化 + 常量池機制。編譯器將 "a" + "b" 識別為常量表達式,編譯時直接優化為 "ab",問題退化為 String b = "ab"。

鐵證如山:Class 文件不會撒謊

編譯兩個類文件並用二進制編輯器對比:

// 版本 1
private String a = "aa";
// 版本 2
private String a = "a" + "a";

生成的 .class 文件完全一致,連一個字節都不差。證明運行期根本不存在 "a" + "a" 的拼接操作。

哪些情況會被視為常量表達式?

  • 字面量拼接:"a" + "b"、 "a" + 1、 "a" + true、 "a" + 3.4 → 全部編譯期優化,== 比較為 true。
  • 變量參與:String bb = "b"; "a" + bb → bb 非常量,無法優化,結果 false。
  • final 修飾的變量:final String bb = "b"; "a" + bb → 編譯器識別為常量,優化為 true。
  • final 但值來自方法調用:final String bb = getBB(); → 無法優化,結果 false。

深度感悟

Java 對 String 的優化近乎將其視為基本類型:+ 是 Java 唯一的「運算符重載」,編譯器與 JVM 合力將能優化的地方全部優化。理解這一機制,不僅能通過面試,更能避免生產環境中因誤解字符串拼接行為而導致的性能陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved