| 特性 | int | Integer |
|---|---|---|
| 類型分類 | 基本資料型別 | 包裝類別(Wrapper Class) |
| 記憶體儲存 | 堆疊,直接存值 | 堆,存物件引用 |
| 預設值 | 0 | null |
| 運算速度 | 快(直接 CPU 指令) | 較慢(物件方法呼叫、拆裝箱開銷) |
| 泛型支援 | 不可用 | 可用(List<Integer> 等) |
| Null 安全性 | 無 null 概念 | 可為 null,需防 NPE |
《Thinking in Java》指出:基本型別有對應的「包裝類別」,當需要在堆上建立代表基本型別的非原始物件時(如集合框架、泛型、反射、序列化),包裝類別派上用場。Java 5+ 引入自動裝箱/拆箱,讓兩者互轉更便捷:
Integer i = 10; // 自動裝箱:Integer.valueOf(10)
int n = i; // 自動拆箱:i.intValue()
Integer sum = 10 + 20; // 隱含拆箱運算後再裝箱
Integer.valueOf() 對 -128 到 127 之間的值有快取,直接返回同一物件實例:
Integer a = 100, b = 100;
System.out.println(a == b); // true(快取命中)
Integer c = 200, d = 200;
System.out.println(c == d); // false(新建物件)
// 正確比較值
System.out.println(c.equals(d)); // true
Integer obj = null;
int val = obj; // 運行時拋出 NullPointerException
防禦性編程:int val = obj != null ? obj : 0; 或使用 Optional<Integer>。
int。Integer。AtomicInteger 或 LongAdder。Integer 物件不可變,任何修改操作都會產生新實例,頻繁修改會增加 GC 壓力。
理解兩者本質差異與 JVM 底層機制,能寫出更健壯、高效的 Java 代碼。