Java 八大基本類型各自擁有一個對應的包裝類,它們是基本類型進入物件世界的「入場券」。本文將系統講解包裝類的**基本用法、自動裝箱/拆箱、核心方法重寫 (equals/hashCode/toString)、Comparable 實現、字符串轉換、常量定義、Number 父類體系、不可變性設計**,並剖析源碼級實現細節。
| 基本類型 | 包裝類 | 備註 |
|---|---|---|
| boolean | Boolean | |
| byte | Byte | |
| short | Short | |
| int | Integer | 命名特異 |
| long | Long | |
| float | Float | |
| double | Double | |
| char | Character | 命名特異 |
除 Integer/Character 外,其餘類名首字母大寫即可。
// 裝箱:基本類型 → 包裝類 Integer iObj = Integer.valueOf(100); Boolean bObj = Boolean.valueOf(true); // 拆箱:包裝類 → 基本類型 int i = iObj.intValue(); boolean b = bObj.booleanValue();
所有包裝類提供靜態 valueOf(primitive) 裝箱、實例 xxxValue() 拆箱。
Integer a = 100; // 編譯器自動轉為 Integer.valueOf(100) int b = a; // 編譯器自動轉為 a.intValue()
本質: 編譯期插入 valueOf()/xxxValue() 調用,**非運行時魔法**。
valueOf() — 關鍵性能差異Integer a = new Integer(100); // 每次新建對象,無緩存 Integer b = Integer.valueOf(100); // 走緩存池,-128~127 直接返回共享實例
鐵律: **優先使用 valueOf() 或自動裝箱**,避免 new。
緩存範圍 (JDK 8+):
Integer:-128 ~ 127 (可通過 -XX:AutoBoxCacheMax 調整上限)Byte、Short、Long:全範圍緩存 (Byte 全量、Short/Long -128~127)Character:0 ~ 127Boolean:僅兩個單例 TRUE/FALSEFloat/Double:**不緩存** (浮點數值域太大、精度問題)equals(Object) — 邏輯相等而非引用相等// Long 示例
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long) obj).longValue();
}
return false;
}
Float/Double 特殊處理: 先將浮點數按 IEEE 754 二進制位模式轉為 int/long (floatToIntBits/doubleToLongBits),再比較位模式。
陷阱: 0.01f != 0.1f * 0.1f 因精度誤差導致位模式不同,equals 返回 false。
hashCode() — 與 equals 契約綁定Byte/Short/Integer/Character:直接返回內部值 (int)value。Boolean:true → 1231、false → 1237 (兩質數,利於哈希分佈)。Long:高 32 位與低 32 位異或 value ^ (value >>> 32)。Float:floatToIntBits(value)。Double:doubleToLongBits(value) 後同 Long 異或。契約: a.equals(b) ⇒ a.hashCode() == b.hashCode(),違反將導致 HashMap/HashSet 失效。
toString() — 自然字符串表示各類均重寫返回對應字面值字符串,如 Integer.toString(100) → "100"。
所有包裝類實現 Comparable<T>,compareTo 按數值大小返回 -1/0/1。
Boolean: false < true。
Float/Double: 同 equals 邏輯,0.01f 與 0.1f*0.1f 比較結果非 0。
| 方向 | 方法 | 示例 | 返回類型 |
|---|---|---|---|
| String → 包裝類 | valueOf(String) | Integer.valueOf("123") | 包裝類 |
| String → 基本類型 | parseXxx(String) | Integer.parseInt("123") | 基本類型 |
| 基本類型 → String | toString(primitive) | Integer.toString(123) | String |
| 進制轉換 (整數類) | toBinaryString/toHexString/parseInt(str, radix) | Integer.toHexString(12345) → "3039" | String/基本類型 |
Boolean.TRUE/FALSE:單例對象。MAX_VALUE/MIN_VALUE:所有數值類型定義,如 Integer.MAX_VALUE = 0x7fffffff。Float/Double 特殊常量:POSITIVE_INFINITY、NEGATIVE_INFINITY、NaN (0.0/0.0)。六大數值包裝類共同繼承 Number,定義六個抽象方法:
byte byteValue(); short shortValue(); int intValue(); long longValue(); float floatValue(); double doubleValue();
實現多態:Number n = 123.45; int i = n.intValue(); // 123。
所有包裝類通過三重手段強制不可變:
final class — 禁止繼承破壞。private final — 構造後不可修改。價值: 天然線程安全、可安全共享、可作為 Map Key/Set 元素、簡化並發推理。
代價: 頻繁修改需創建新對象 (如 BigInteger/BigDecimal 同理),高性能場景可用基本類型或可變容器 (AtomicInteger)。
本文覆蓋了包裝類日常開發 95% 的知識點。下兩篇將深入:
bitCount, highestOneBit, rotateLeft 等)。isDigit, toUpperCase, getType 等)。valueOf 分支邏輯、parseInt 解析流程。關注微信公眾號「老馬說編程」,從入門到高級,深入淺出探索 Java 本質。
