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

Java 堆與棧深度解析:記憶體模型、String 常量池機制與對象創建策略

     編輯:Java 相關知識

棧 vs 堆:核心對比

維度棧堆
管理方式自動(編譯器/運行期)垃圾回收器 (GC) 自動管理
存取速度極快(僅次於暫存器)較慢(動態分配)
靈活度大小/生命週期編譯期須確定動態分配,大小生命週期不固定
主要存放基本型別變數、對象引用對象實體、陣列
資料共享支援(值相同共用記憶體)預設不共用(每次 new 新對象)

棧資料共享機制演示


int a = 3;
int b = 3;
// 編譯器:建立 a 參考 → 檢查棧有無 3 → 無則存入 → a 指向 3
// 處理 b:建立 b 參考 → 棧已有 3 → b 直接指向 3
// 結果:a、b 共指向同一個 3
a = 4; // 編譯器搜尋/建立 4,a 指向 4,b 不受影響

此共享由編譯器自動完成,節省空間。**與對象引用共享本質不同**:修改對象內部狀態會影響所有引用。

String 的特殊雙重創建機制

方式一:new String("abc")

  • **堆中創建新對象**,每次調用必建新對象。
  • 不檢查常量池,負擔較重。

方式二:String str = "abc"

  • **棧中建立引用** → 檢查字串常量池(棧區一部分)有無 "abc" → 無則存入池 → 引用指向池中對象;有則直接指向。
  • **多個相同字面值共用同一常量池對象**,節省記憶體、提升速度(JVM 自動優化)。

比較陷阱與最佳實踐


String s1 = "abc";
String s2 = "abc";
s1 == s2; // true(同一常量池對象)

String s3 = new String("abc");
String s4 = new String("abc");
s3 == s4; // false(不同堆對象)
s3.equals(s4); // true(內容相等)
  • **比較內容用 equals()**
  • **比較引用指向用 ==**

關鍵認知修正

String str = "abc" **不一定創建新對象**!可能只是指向現有常量池對象。唯有 new() 保證每次創建新對象。

效能建議

因 String 不可變,頻繁修改字串請用 StringBuffer/StringBuilder 避免大量臨時對象產生 GC 壓力。

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