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

J2SE 5.0 自動裝箱與拆箱深度解析:機制、觸發時機與效能影響

     編輯:J2SE

自動裝箱/拆箱讓基本型別與包裝類別隱式轉換,消除手動 `new Integer(i)` / `i.intValue()` 的樣板碼,但引入效能與語意陷阱。

核心機制

  • 裝箱:基本型別 → 包裝類。編譯器插入 `Integer.valueOf(i)`
  • 拆箱:包裝類 → 基本型別。編譯器插入 `obj.intValue()`

觸發場景

程式碼實際編譯後
List list = new ArrayList<>(); list.add(1);list.add(Integer.valueOf(1));
Integer obj = 1; int i = obj + 2;Integer obj = Integer.valueOf(1); int i = obj.intValue() + 2;
Integer a = 100; Integer b = 100; a == b引用比較,-128~127 快取範圍內為 true

快取機制

`Integer.valueOf(int)` 對 -128 到 127 回傳共用快取實例,超出範圍新建物件。`Long`/`Short`/`Byte`/`Character` 同理。`Float`/`Double` 不快取。

效能與記憶體代價

  • 頻繁裝箱產生大量短命物件,增加 GC 壓力
  • 科學計算、大量集合操作建議用基本型別陣列或專用庫(Eclipse Collections, FastUtil)
  • JVM 逃逸分析可消除標量替換後的裝箱,但不穩定

重載解析陷阱

void m(Integer x) { ... }
void m(int x) { ... }
m(1);        // 呼叫 m(int)
m(new Integer(1)); // 呼叫 m(Integer)
m(null);     // 編譯錯誤:模稜兩可

最佳實踐

  • 集合首選基本型別特化庫,或接受裝箱代價換取 API 簡潔
  • 比較包裝類**永遠用 `.equals()`**,除非確定在快取範圍
  • 避免在迴圈中對基本型別集合做 `+=` 等複合賦值(隱含拆箱+裝箱)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved