| 特性 | 棧 | 堆 |
|---|---|---|
| 存取速度 | 極快 (僅次於寄存器) | 較慢 (動態分配) |
| 靈活性 | 大小/生命週期須編譯期確定 | 動態分配,GC 自動回收 |
| 存儲內容 | 基本類型變量、對象引用 | 對象實例、數組、包裝類對象 |
| 共享特性 | 基本類型字面值可共享 | 對象引用指向同一實例可共享 |
int a = 3;
int b = 3;
編譯器處理:
a,棧中創建字面值 3,a 指向它b,發現棧已有 3,直接指向同一地址a、b 共享同一字面值 3關鍵區別:修改 a = 4 時,編譯器重新查找/創建 4,a 指向新地址,b 仍指向 3。基本類型賦值修改的是引用指向,不影響其他引用。這與對象引用共享時修改內部狀態會互相影響本質不同。
Integer, Double, String 等為包裝類,使用 new 在堆創建實例Integer i = 3 → Integer.valueOf(3) (緩存 -128~127)String s1 = new String("abc");
String s2 = new String("abc");
s1 == s2; // false,兩個獨立堆對象
JVM 內部步驟:
str"abc"String 對象入池;有則直接返回池中對象引用str 指向池中對象String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true,同一池對象
str1 = "bcd";
System.out.println(str1 == str2); // false,str1 指向新對象 "bcd"
System.out.println(str1 + ", " + str2); // bcd, abc
String s = "text" 利用常量池節省內存、提升速度String 不可變,拼接產生大量臨時對象== 比較引用地址,equals() 比較字符序列