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

Java 裝箱與拆箱深度解析:原理、緩存陷阱與面試必考點

     編輯:Java 相關知識

基本概念

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

Java SE 5 引入自動裝箱/拆箱,簡化代碼:

Integer i = 10;  // 裝箱
int n = i;       // 拆箱

字節碼層面驗證

public class Main {
    public static void main(String[] args) {
        Integer i = 10;
        int n = i;
    }
}

反編譯後:

Integer i = Integer.valueOf(10);  // 裝箱
int n = i.intValue();             // 拆箱

結論:裝箱調用 valueOf,拆箱調用 xxxValue。

核心陷阱:Integer 緩存機制

Integer i1 = 100, i2 = 100;
Integer i3 = 200, i4 = 200;
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // false

原因:Integer.valueOf 內部緩存 [-128, 127] 範圍內的對象:

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

影響範圍:

包裝類型緩存範圍備註
Integer、Short、Byte、Character、Long-128 ~ 127(可配置上限)Long 緩存較小
Double、Float無緩存浮點數無限,不適合緩存
BooleanTRUE/FALSE 兩個單例直接返回常量

面試高頻題精選

1. new Integer(10) vs Integer i = 10

  • 前者不觸發自動裝箱,每次創建新對象。
  • 後者觸發裝箱,走 valueOf,可能復用緩存對象,性能更優。

2. 綜合比較題

Integer a = 1, b = 2, c = 3, d = 3, e = 321, f = 321;
Long g = 3L, h = 2L;

System.out.println(c == d);           // true (緩存)
System.out.println(e == f);           // false (超出緩存)
System.out.println(c == (a + b));     // true (算術運算觸發拆箱,比較數值)
System.out.println(c.equals(a + b));  // true (拆箱後裝箱再比較)
System.out.println(g == (a + b));     // true (Long 與 int 運算,拆箱比較數值)
System.out.println(g.equals(a + b));  // false (equals 不轉型,Long vs Integer)
System.out.println(g.equals(a + h));  // true (Long + Long = Long,數值相等)

核心規則:

  1. == 兩側皆為包裝類 → 比較引用;有算術運算 → 觸發拆箱比較數值。
  2. equals 不進行類型轉換,類型不同直接返回 false。

總結

理解裝箱/拆箱本質、緩存範圍、== 與 equals 語義差異,是寫出正確、高性能 Java 代碼的關鍵,也是面試必考核心點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved