Java 是面向對象語言,但八大基本型別(byte, short, int, long, float, double, char, boolean)不是對象,無法直接放入集合、泛型或作為 Object 參數傳遞。為了橋接這一鴻溝,Java 為每種基本型別提供了對應的包裝類:
| 基本型別 | 包裝類 | 常用常量 |
|---|---|---|
| byte | Byte | MIN_VALUE, MAX_VALUE, SIZE, BYTES |
| short | Short | MIN_VALUE, MAX_VALUE, SIZE, BYTES |
| int | Integer | MIN_VALUE, MAX_VALUE, SIZE, BYTES |
| long | Long | MIN_VALUE, MAX_VALUE, SIZE, BYTES |
| float | Float | MIN_VALUE, MAX_VALUE, MIN_NORMAL, MAX_EXPONENT... |
| double | Double | MIN_VALUE, MAX_VALUE, MIN_NORMAL, MAX_EXPONENT... |
| char | Character | MIN_VALUE, MAX_VALUE, SIZE, BYTES |
| boolean | Boolean | TRUE, FALSE |
註:JDK 9 後新增 Void 對應 void,但無基本型別對應。
Integer i = 100; // 裝箱:int -> Integer.valueOf(100)
int n = i; // 拆箱:i.intValue()
編譯器自動插入 valueOf() 與 xxxValue() 呼叫,簡化代碼但隱藏性能開銷。
// 字串 -> 基本型別(拋 NumberFormatException)
int a = Integer.parseInt("123");
double b = Double.parseDouble("3.14");
// 基本型別 -> 字串
String s1 = String.valueOf(456); // 推薦:無 NPE 風險
String s2 = Integer.toString(789); // 略快,僅限對應型別
Integer.valueOf(int) 會快取 [-128, 127] 範圍內的實例:
Integer a = 100, b = 100;
System.out.println(a == b); // true(同一快取實例)
Integer c = 200, d = 200;
System.out.println(c == d); // false(新建對象)
-XX:AutoBoxCacheMax=size 擴大快取上限(下限固定 -128)。Long、Short、Byte、Character(0-127)同樣有快取;Float/Double 無快取。| 陷阱 | 後果 | 正確做法 |
|---|---|---|
new Integer(100) 強制新建對象 | 浪費記憶體、繞過快取 | 統一用 Integer.valueOf() 或自動裝箱 |
| 拆箱時 NPE | Integer i = null; int n = i; 拋 NPE | 先判空或用 Optional |
| 集合存基本型別 | 編譯錯誤 | 用包裝類:List<Integer> |
| == 比較包裝類 | 比較引用而非值 | 用 equals() 或拆箱後比較 |
| 頻繁裝箱拆箱熱路徑 | GC 壓力、效能下降 | 局部變數用基本型別、批量處理用陣列 |
// 不再建議使用建構子(已標記 @Deprecated(since="9", forRemoval=true))
Integer i = Integer.valueOf("42"); // 字串解析
Integer j = Integer.valueOf(42); // 數值轉換(走快取)
理解基本型別與包裝類的轉換規則、快取範圍、空值風險,是寫出高效、健壯 Java 代碼的基礎。日常開發請遵循:優先用基本型別、必要時裝箱、拆箱前判空、比較用 equals。