| 基本類型 | 引用類型 |
int, double, boolean... (8種) | 所有類、介面、數組、Object 子類 |
| 存儲值本身 | 存儲引用(地址) |
| 無方法、無繼承 | 有方法、支持多態、泛型 |
| 默認值 0/false | 默認值 null |
| 不佔用堆內存 | 對象在堆,引用在棧 |
包裝類解決的核心矛盾
基本類型不是 Object 子類,無法用於泛型、集合、反射等需要 Object 的場景。
場景 1:集合存儲
List list = new ArrayList<>(); // 編譯錯誤!泛型參數必須是引用類型
List list = new ArrayList<>(); // 正確
list.add(1); // 自動裝箱: 1 -> Integer.valueOf(1)
int x = list.get(0); // 自動拆箱: Integer -> int
場景 2:方法參數多態
void print(Object obj) { System.out.println(obj); }
print(1); // 編譯器自動裝箱: 1 -> new Integer(1) -> Object
場景 3:null 語義表達(關鍵)
// 數據庫映射實體類
class User {
Integer age; // 可為 null,表示「未填寫/未知」
// int age; // 不可為 null,默認 0 有歧義:是 0 歲還是未填寫?
}
基本類型無 null 值,數據庫普遍存在 NULL,實體類必須用包裝類。
場景 4:泛型與反射
Class clazz = Integer.class; // 反射
Method m = clazz.getMethod("parseInt", String.class);
自動裝箱/拆箱機制
- 裝箱:
Integer i = 10; → Integer.valueOf(10)
- 拆箱:
int x = i; → i.intValue()
- 編譯器自動插入,JDK 5+ 支持
性能與緩存
Integer.valueOf() 緩存 [-128, 127] 範圍對象,避免重複創建
- 超出範圍
new Integer(),頻繁裝箱拆箱有性能開銷
- 熱點代碼建議用基本類型,邊界轉換用包裝類
總結
包裝類是基本類型進入「物件世界」的入場券。它們使基本類型具備:
- Object 血統(多態、集合、泛型)
- null 語義(數據庫映射、可選值)
- 方法行為(解析、格式化、比較、緩存)
沒有包裝類,Java 的類型系統將割裂為兩個無法互通的孤島。
- 上一篇文章: C# CollectionBase 類中 List 屬性訪問機制解析
- 下一篇文章: Java 方法參數:基本類型 vs 包裝類型的選擇與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved