首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 基礎進階:包裝類核心機制、自動裝箱拆箱與字符串轉換全解析

     編輯:Java 綜合教學

為什麼需要包裝類?

Java 基本類型(int、double、boolean 等)不是對象,無法調用方法、無法存入集合、無法泛型化。包裝類(Integer、Double、Boolean...)將基本類型封裝為對象,賦予其對象特性,並提供豐富的工具方法(進制轉換、比較、解析等)。

八大基本類型與包裝類對應表

基本類型包裝類父類
byteByteNumber
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacterObject
booleanBooleanObject

所有數值型包裝類繼承自抽象類 Number,統一定義 intValue()、doubleValue() 等轉換方法。

核心機制:裝箱與拆箱

1. 手動裝箱/拆箱(JDK 1.4 及之前)

// 手動裝箱
Integer iObj = new Integer(100); // 構造器(JDK 9 棄用)
Integer iObj = Integer.valueOf(100); // 靜態工廠方法,推薦

// 手動拆箱
int iPrim = iObj.intValue(); // 實例方法

2. 自動裝箱/拆箱(JDK 5+ 語法糖)

// 自動裝箱:基本類型 → 包裝類
Integer autoBox = 100; // 編譯器轉為 Integer.valueOf(100)

// 自動拆箱:包裝類 → 基本類型
int autoUnbox = autoBox; // 編譯器轉為 autoBox.intValue()

編譯器實現:javac 在編譯期插入 valueOf/xxxValue() 調用,字節碼中無特殊指令。

3. 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 無緩存。

基本類型與字符串雙向轉換

1. 基本類型 → 字符串(三種方式)

int num = 123;
String s1 = String.valueOf(num);      // 靜態方法,null 安全
String s2 = Integer.toString(num);    // 包裝類靜態方法
String s3 = num + "";                 // 字符串連接,編譯器優化為 StringBuilder

2. 字符串 → 基本類型(兩種方式)

String str = "456";
int i1 = Integer.parseInt(str);       // 返回基本類型,性能稍優
Integer i2 = Integer.valueOf(str);    // 返回包裝類,會觸發自動拆箱
// 其他類型對應 parseXxx / valueOf,如 Double.parseDouble()

異常處理:格式非法拋出 NumberFormatException,生產代碼需 try-catch 或正則預校驗。

Character 類與轉義字符

Character 封裝 char,提供分類判斷(isDigit、isLetter、isUpperCase)、大小寫轉換(toUpperCase)、Unicode 處理等工具方法。Java 轉義序列:\t、\n、\r、\\、\"、\'、\uXXXX(Unicode)。

總結與避坑指南

  • 集合泛型只能用包裝類:List<Integer> ✅,List<int> ❌。
  • 頻繁裝箱拆箱有性能開銷:熱點循環優先用基本類型,或用 Trove/FastUtil 等基本類型集合庫。
  • null 風險:包裝類可為 null,自動拆箱時會拋 NPE(如 Integer i = null; int j = i;)。
  • 緩存範圍可調:-XX:AutoBoxCacheMax=2000 擴大 Integer 緩存上限(JDK 8+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved