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

Java String 內存機制深度解析:常量池、編譯優化與 new 對象的區別

     編輯:程式設計綜合問答

代碼回顧

String str  = "abc";
String str1 = "ab";
String str2 = str1 + "c";      // 運行期拼接
String str3 = "a" + "b" + "c"; // 編譯期優化

System.out.println(str == str2);  // false
System.out.println(str == str3);  // true
System.out.println(str2 == str3); // false

核心知識點

  1. 字符串字面量(如 "abc")存放在字符串常量池,同一字面量只有一份。
  2. 編譯期優化:"a" + "b" + "c" 全是常量,編譯器直接優化為 "abc",放入常量池,故 str == str3 為 true。
  3. 運行期拼接:str1 + "c" 中 str1 是變量,編譯器無法優化,運行時會創建新對象在堆內存,故 str == str2 為 false。
  4. == 比較引用地址,equals 比較內容。引用類型務必用 equals() 判斷內容相等。

內存圖示

常量池: "abc" ← str, str3 指向這裡
堆內存: new String("abc") ← str2 指向這裡 (不同地址)

最佳實踐

  • 比較字符串內容**永遠用 equals()** 或 Objects.equals()。
  • 頻繁拼接用 StringBuilder/StringBuffer,避免產生大量臨時對象。
  • 理解 intern() 方法:可將堆上字符串放入/獲取常量池引用。

總結

== 比較的是「是不是同一個對象」,equals() 比較的是「內容是不是一樣」。搞清常量池、編譯優化、運行期 new 對象三者關係,是 Java 面試與避坑必修課。

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