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

Java 自動裝箱與拆箱深度剖析

     編輯:Java 程式設計入門

引言

自 JDK 1.5 起,Java 引入自動裝箱與拆箱機制,讓基本型別與其包裝類別之間能自動轉換,極大簡化了程式碼撰寫。本文將深入探討其運作原理、享元模式快取行為及常見陷阱。

基本概念

  • 自動裝箱:基本型別 → 對應包裝類別物件。例如 Integer num = 10; 編譯器轉為 Integer num = Integer.valueOf(10);。
  • 自動拆箱:包裝類別物件 → 基本型別。例如 int n = num; 編譯器轉為 int n = num.intValue();。

享元模式與整數快取

為了效能,Integer.valueOf() 對 -128 到 127 之間的整數採用快取策略,回傳同一物件實例;超出此範圍則每次建立新物件。

Integer a = 100, b = 100;
System.out.println(a == b); // true(快取)

Integer c = 200, d = 200;
System.out.println(c == d); // false(新物件)

注意:直接使用 new Integer(100) 總是建立新物件,不會使用快取。

適用型別

八大基本型別皆有對應包裝類別支援自動裝箱/拆箱:

基本型別包裝類別
booleanBoolean
byteByte
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble

運算與比較中的隱式轉換

  • 算術運算:Integer i = 10; System.out.println(i + 5); → 先拆箱相加,結果為 int。
  • 遞增運算:i++ 會拆箱、遞增、再裝箱回原變數。
  • 邏輯運算:Boolean b = true; b && false 會先拆箱為 boolean。

String 的特殊情況

String s = "abc"; 使用字串常數池,類似享元模式;new String("abc") 則強制建立新物件。字串為不可變類別,編譯器優化較多。

底層實作細節

  • 裝箱:在堆上建立包裝物件,複製基本型別值。
  • 拆箱:檢查物件型別,取出內部值賦給基本型別變數。
  • 反射場景中頻繁用到裝箱/拆箱(如 Method.invoke 參數處理)。

最佳實踐建議

  1. 優先使用基本型別,避免不必要的物件建立與 GC 壓力。
  2. 集合儲存數值時,考慮使用基本型別陣列或第三方庫(如 Trove、FastUtil)減少裝箱開銷。
  3. 比較包裝類別數值務必用 .equals(),勿用 ==(除非確定在快取範圍內)。
  4. 注意 null 拆箱會拋出 NullPointerException。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved