Java 為 8 種基本類型提供對應的引用類型,使基本類型具備對象特性(可存入集合、作為泛型參數、調用方法、支持 null),實現「一切皆對象」的語言一致性。
| 基本類型 | 包裝類 | 繼承關係 |
|---|---|---|
| byte | Byte | Number → Object |
| short | Short | |
| int | Integer | |
| long | Long | |
| float | Float | |
| double | Double | |
| char | Character | Object |
| boolean | Boolean | Object |
// 裝箱 Integer i = new Integer(6); // 拆箱 Float f = new Float(66.6f); float val = f.floatValue();
Integer i = 60; // 自動裝箱 → Integer.valueOf(60) Float f = 66.6f; // 自動裝箱 → Float.valueOf(66.6f) int a = i; // 自動拆箱 → i.intValue() float b = f; // 自動拆箱 → f.floatValue()
Wrapper.valueOf(primitive)wrapper.primitiveValue()Integer.valueOf(int) 內部緩存 [-128, 127] 範圍內的實例:
Integer a = 100, b = 100; // true,同一緩存對象 System.out.println(a == b); Integer c = 200, d = 200; // false,新建對象 System.out.println(c == d);
| 包裝類 | 緩存範圍 | 備註 |
|---|---|---|
| Byte | -128 ~ 127 | 全範圍緩存 |
| Short | -128 ~ 127 | |
| Long | -128 ~ 127 | |
| Character | 0 ~ 127 | ASCII 範圍 |
| Boolean | true/false | 單例模式 |
| Float/Double | 無緩存 | 浮點數精度問題,不適合緩存 |
可通過 JVM 參數調整 Integer 緩存上限:-XX:AutoBoxCacheMax=2000(下限固定 -128)。
// 字符串 → 基本類型
int i = Integer.parseInt("123");
float f = Float.parseFloat("3.14");
boolean b = Boolean.parseBoolean("true");
// 基本類型 → 字符串
String s1 = Integer.toString(123);
String s2 = String.valueOf(123); // 通用,底層調用 toString
String s3 = 123 + ""; // 拼接隱式調用 valueOf
int n = 255; System.out.println(Integer.toBinaryString(n)); // 11111111 System.out.println(Integer.toHexString(n)); // ff System.out.println(Integer.toOctalString(n)); // 377
Integer x = 100, y = 100; System.out.println(x == y); // true (緩存) System.out.println(x.equals(y)); // true (值比較) Integer m = 200, n = 200; System.out.println(m == n); // false (引用比較) System.out.println(m.equals(n)); // true (值比較) // 結論:包裝類比較值務必用 equals()
// 反模式:Long 累加觸發百萬次裝箱/拆箱 Long sum = 0L; for (long i = 0; i < 1_000_000; i++) sum += i; // 正確:基本類型累加 long sum = 0L; for (long i = 0; i < 1_000_000; i++) sum += i;
Listlist = new ArrayList<>(); list.add(100); // 裝箱 int val = list.get(0); // 拆箱 // 大量數據場景考慮使用基本類型集合庫(Eclipse Collections、FastUtil)或數組
Integer obj = null; int val = obj; // NPE:拆箱調用 null.intValue() // 防禦:Objects.requireNonNull(obj) 或 obj != null ? obj : 0
所有包裝類均為 final、內部值 final,線程安全,可安全共享。
valueOf/xxxValue。== 比較結果,比較值必須用 equals()。