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

Java 編譯器對 String 常量優化:編譯期常量折疊揭秘

     編輯:Java 相關知識

經典面試題

String a = "ab";
String b = "a" + "b";
System.out.println(a == b); // 輸出?

四種常見答案分析

  1. true (新手):以為內容相等即相等,忽略 == 比較參考。
  2. false (進階):知道 + 產生新物件,但未意識到編譯期優化。
  3. true (高手):知道字串常量池,b 從池取得 "ab",但理由為「運行期計算後入池」——錯誤。
  4. true (正確):編譯期常量折疊。"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

只有編譯期可確定的字串常量表達式才會折疊。

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