Object,可放入集合。byte, short, int, long, float, double, char, boolean — 非物件,效能佳但無法泛型化。new Integer(i) (Boxing) / i.intValue() (Unboxing),繁瑣易誤。Integer i = 31415;map.put(true, null); (Boolean)System.out.println((Long) 27828L);int i = new Integer(32);frame.setVisible(new Boolean(true));System.out.println((long) new Long(31415L));Byte a=1, b=-1; System.out.println((a++) + ~b);int[] arr = new int[new Character('★')];switch 判斷:switch (new Character('a')) { case 'a': ... }if (new Boolean(true)) ...| 限制 | 錯誤範例 | 修正 |
|---|---|---|
| 不可同時向上轉型 + Autoboxing | int i=1; (Long)i | (Long)(long)i |
| 不可同時 Auto-Unboxing + 向下轉型 | Integer i=1; (byte)i | (byte)(int)i |
| 基本型別陣列 ⇄ 包裝類陣列不自動轉換 | Integer[] arr = intArr; | 手動逐元素複製 |
| 基本型別無法呼叫方法 | int i=1; i.byteValue() | 先裝箱 Integer.valueOf(i).byteValue() |
Integer i = null;
int j = i; // 執行期拋 NullPointerException (相當於 i.intValue())
編譯期無錯誤,務必檢查 null 再拆箱。
void test(int i) { System.out.println("int"); }
void test(Integer i) { System.out.println("Integer"); }
test(1); // 輸出 int
test(new Integer(1)); // 輸出 Integer
編譯器偏好不需裝箱/拆箱的簽章,避免歧義。
JSR 201 規範:-128 ~ 127 的 Integer、Boolean、Character 由 valueOf() 快取,裝箱後 == 為 true;超出範圍或 Character 非 ASCII 則 false。比較值務必用 equals()。
Integer i = 1;
i++; // 實際:i = Integer.valueOf(i.intValue() + 1); 新物件!
Integer j = i; // j 指向舊物件
System.out.println(i == j); // false
Map counts = new HashMap<>();
for (String w : args) {
counts.put(w, counts.getOrDefault(w, 0) + 1); // 每次 get/put 觸發裝箱/拆箱
}
改用 IntSummaryStatistics 或原生 Map 搭配 compute() 仍難避免裝箱;極致效能需基本型別 Map。