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

Java 字串常量池與 new String() 建立物件差異

     編輯:程式設計綜合問答

問題:String str = "abc"; 與 String str1 = new String("abc"); 在記憶體中有何不同?

記憶體圖解

String str = "abc";
        │
        ▼
┌─────────────────────┐
│   String Constant Pool (常量池)  │
│  "abc"  ◄─────────────┤  (單一實例,JVM 保證唯一)
└─────────────────────┘

String str1 = new String("abc");
        │
        ▼
┌─────────────────────┐     ┌─────────────────────┐
│   Heap (堆)         │     │   String Constant Pool │
│  String Object      │     │  "abc" (常量池已有)    │
│  value: "abc"       │     └─────────────────────┘
│  ref: str1 ─────────┘
└─────────────────────┘

關鍵差異

寫法建立物件數儲存位置指向
String s = "abc";0 或 1(常量池已有則複用)常量池常量池實例
new String("abc")1(堆上新建)+ 常量池可能有 1 個堆堆上新物件

intern() 方法

String s2 = new String("abc").intern(); // 將堆上物件內容登錄至常量池,返回常量池引用
// s2 == "abc" 為 true
  • intern():若常量池已有相同內容字串,返回該引用;否則將此字串加入常量池並返回引用。
  • JDK 7+ 常量池移至堆中,intern() 行為略有調整,但語意一致。

最佳實務

  • 優先使用字面值 "abc",享受常量池複用與 == 比較優勢。
  • 需動態建立、頻繁修改字串內容時,用 StringBuilder/StringBuffer。
  • 極少情況需 new String()(如刻意建立不同物件給 synchronized 鎖用)。

理解常量池機制,能避免記憶體浪費與錯誤的 == 比較。

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