Java 提供兩種根本不同的類型:
boolean, byte, char, short, int, long, float, double —— 直接存儲值。每個原始類型都有對應的封裝類:Boolean, Byte, Character, Short, Integer, Long, Float, Double。
| 特性 | 原始類型 | 引用類型 |
|---|---|---|
| 存儲內容 | 數值本身 | 對象引用(地址) |
| 內存位置 | 棧幀局部變量表 | 引用在棧,對象在堆 |
| 默認值(實例變量) | 0, 0.0, false, '\u0000' | null |
| 可調用方法 | 否 | 是 |
| 賦值語義 | 值拷貝 | 引用拷貝(指向同一對象) |
int a = 5;
int b = a; // 拷貝值
b = 10;
System.out.println(a); // 5,未受影響
Point p1 = new Point(0, 0);
Point p2 = p1; // 拷貝引用,指向同一對象
p2.setLocation(5, 5);
System.out.println(p1); // java.awt.Point[x=5,y=5] —— p1 也被修改!
public void modifyPrimitive(int x) { x = 20; }
public void modifyObject(Point p) { p.setLocation(10, 10); }
int val = 5;
Point pt = new Point(0,0);
modifyPrimitive(val); // val 仍為 5
modifyObject(pt); // pt 變為 (10,10)
List list = new ArrayList<>();
StringBuffer sb = new StringBuffer("A");
list.add(sb);
sb.append("B");
list.add(sb); // 列表中兩個元素指向同一對象
// 輸出:[AB, AB] 而非 [A, AB]
結論:集合、Map 存儲的均為對象引用,修改原對象會影響集合內所有引用該對象的位置。
new Integer(5):使用 Integer.valueOf(5) 利用緩存(-128~127)。Boolean.TRUE/FALSE 或 valueOf():杜絕 new Boolean()。Integer a = 1000, b = 1000;
System.out.println(a == b); // false,超出緩存範圍創建新對象
Integer c = 100, d = 100;
System.out.println(c == d); // true,命中緩存
// 循環中裝箱產生大量臨時對象
Long sum = 0L;
for (long i = 0; i < 100000; i++) sum += i; // 每次 += 觸發裝箱/拆箱
// 應改用 long sum = 0L;
理解引用與原始類型的語義差異,是編寫正確、高效 Java 代碼的基石。牢記:原始類型存值、引用類型存地址;賦值傳參均為拷貝,但拷貝的內容不同。合理選擇類型,善用封裝類緩存,避免不必要的對象創建與拆箱裝箱開銷。