首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java final 字符串變量參與拼接的編譯期常量優化原理

     編輯:程式設計綜合問答

代碼現象

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(); // 運行期構建

參考討論

CSDN 關於 final 字符串拼接常量池行為的深度討論

用戶頭像

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