Java 基本類型(int、double、boolean 等)不是對象,無法調用方法、無法存入集合、無法泛型化。包裝類(Integer、Double、Boolean...)將基本類型封裝為對象,賦予其對象特性,並提供豐富的工具方法(進制轉換、比較、解析等)。
| 基本類型 | 包裝類 | 父類 |
|---|---|---|
| byte | Byte | Number |
| short | Short | |
| int | Integer | |
| long | Long | |
| float | Float | |
| double | Double | |
| char | Character | Object |
| boolean | Boolean | Object |
所有數值型包裝類繼承自抽象類 Number,統一定義 intValue()、doubleValue() 等轉換方法。
// 手動裝箱
Integer iObj = new Integer(100); // 構造器(JDK 9 棄用)
Integer iObj = Integer.valueOf(100); // 靜態工廠方法,推薦
// 手動拆箱
int iPrim = iObj.intValue(); // 實例方法
// 自動裝箱:基本類型 → 包裝類
Integer autoBox = 100; // 編譯器轉為 Integer.valueOf(100)
// 自動拆箱:包裝類 → 基本類型
int autoUnbox = autoBox; // 編譯器轉為 autoBox.intValue()
編譯器實現:javac 在編譯期插入 valueOf/xxxValue() 調用,字節碼中無特殊指令。
Integer.valueOf() 緩存機制(必考知識點)Integer.valueOf(int i) 內部緩存 [-128, 127] 範圍內的 Integer 對象:
Integer a = 100; Integer b = 100; System.out.println(a == b); // true(同一緩存對象)
Integer c = 200; Integer d = 200; System.out.println(c == d); // false(新建對象)
建議:比較包裝類數值永遠用 equals(),禁止用 ==。Long/Short/Byte 同理緩存 [-128, 127];Float/Double 無緩存。
int num = 123;
String s1 = String.valueOf(num); // 靜態方法,null 安全
String s2 = Integer.toString(num); // 包裝類靜態方法
String s3 = num + ""; // 字符串連接,編譯器優化為 StringBuilder
String str = "456";
int i1 = Integer.parseInt(str); // 返回基本類型,性能稍優
Integer i2 = Integer.valueOf(str); // 返回包裝類,會觸發自動拆箱
// 其他類型對應 parseXxx / valueOf,如 Double.parseDouble()
異常處理:格式非法拋出 NumberFormatException,生產代碼需 try-catch 或正則預校驗。
Character 封裝 char,提供分類判斷(isDigit、isLetter、isUpperCase)、大小寫轉換(toUpperCase)、Unicode 處理等工具方法。Java 轉義序列:\t、\n、\r、\\、\"、\'、\uXXXX(Unicode)。
List<Integer> ✅,List<int> ❌。null,自動拆箱時會拋 NPE(如 Integer i = null; int j = i;)。-XX:AutoBoxCacheMax=2000 擴大 Integer 緩存上限(JDK 8+)。