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

Java 自動裝箱與拆箱深度解析:原理、Integer 快取機制與面試高頻題

     編輯:Java 相關知識

基本概念

  • 裝箱:基本型別 → 包裝類型(如 int → Integer),自動調用 valueOf()。
  • 拆箱:包裝類型 → 基本型別,自動調用 xxxValue()(如 intValue())。

Java 5 前需手動 new Integer(10),Java 5+ 支援 Integer i = 10;。

底層實現(以 Integer 為例)

Integer i = 10;     // 編譯為 Integer.valueOf(10)
int n = i;          // 編譯為 i.intValue()
  • 裝箱調用 Integer.valueOf(int)。
  • 拆箱調用 Integer.intValue()。
  • 其他包裝類同理(Double.valueOf、Character.valueOf 等)。

Integer 快取機制(-128 ~ 127)

public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    return new Integer(i);
}

IntegerCache 靜態初始化區間內所有整數物件。high 可透過 -XX:AutoBoxCacheMax 調整(預設 127)。

面試高頻題詳解

題 1:Integer 比較

Integer i1 = 100, i2 = 100, i3 = 200, i4 = 200;
System.out.println(i1 == i2); // true(快取命中)
System.out.println(i3 == i4); // false(新建物件)

題 2:Double 比較

Double d1 = 100.0, d2 = 100.0;
System.out.println(d1 == d2); // false(Double 無快取)

原因:浮點數在任意區間內個數無限,無法快取。

題 3:Boolean 比較

Boolean b1 = false, b2 = false, b3 = true, b4 = true;
System.out.println(b1 == b2); // true
System.out.println(b3 == b4); // true

Boolean.valueOf 直接回傳單例 TRUE/FALSE。

題 4:new Integer(xxx) vs Integer i = xxx

  1. 前者不觸發裝箱,每次新建物件;後者觸發裝箱,可能複用快取。
  2. 後者效能與記憶體通常更優(利用快取),但非絕對。

最佳實踐

  • 優先使用基本型別進行運算,避免熱點路徑產生大量包裝物件。
  • 比較包裝類型值務必用 .equals(),勿用 ==。
  • 集合泛型無法使用基本型別時,注意裝箱開銷;大量資料可考慮基本型別集合庫(如 FastUtil、Eclipse Collections)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved