| 維度 | 棧 | 堆 |
|---|---|---|
| 管理方式 | 自動(編譯器/運行期) | 垃圾回收器 (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 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 壓力。