Java一直存在兩套類型系統:引用類型(類、介面,可作為Object保存)與基本類型(byte、short、int、long、float、double、char、boolean,非對象,不可作為Object)。雙系統帶來性能優勢(基本類型創建快、佔用少、回收易),但編碼極不便:無法定義同時持有兩類數據的變量/參數,集合類只能存對象,放入基本類型需手動包裝。
傳統做法定義Object類型變量,配合Boxing(基本類型→包裝對象)和Unboxing(包裝對象→基本類型)操作橋接兩套系統。J2SE 1.5引入Autoboxing與Auto-Unboxing,由編譯器自動完成轉換,極大簡化代碼。
// 手動裝箱
Collection integers = new ArrayList();
for (int i = 0; i < 10; i++) {
integers.add(new Integer(i)); // 必須手動包裝
}
// 手動拆箱
for (Iterator it = integers.iterator(); it.hasNext(); ) {
Integer i = (Integer) it.next();
System.out.println(i.intValue() + 1); // 必須調用xxxValue()
}
八大包裝類:Byte, Short, Integer, Long, Float, Double, Character, Boolean(均在java.lang)。
// 自動裝箱:編譯器轉為 integers.add(Integer.valueOf(1));
Collection al = new ArrayList();
al.add(1); // 直接放入int
// 自動拆箱:編譯器插入 intValue() 調用
Integer one = new Integer(1);
int two = one + 1; // 直接參與算術運算
J2SE 1.5各包裝類新增靜態valueOf(基本類型)方法用於裝箱,拆箱自動調用對應xxxValue()方法。
Integer.valueOf()對-128~127範圍整數緩存,同值返回同一對象;超出範圍則新建對象。==比較需謹慎,建議用equals()。null,拋出NullPointerException。equals(),不用==。null拆箱風險,必要時添加非空判斷。自動裝箱/拆箱是語法糖,正確理解其本質與邊界,方能寫出高效健壯的代碼。