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

Integer 裝箱拆箱機制與緩存陷阱:避開 == 比較的坑

     編輯:Java 綜合教學

核心概念

  • 裝箱:基本型別 → 包裝類型 Integer i = 10; 等同 Integer.valueOf(10)
  • 拆箱:包裝類型 → 基本型別 int n = i; 等同 i.intValue()

整數緩存機制

Integer.valueOf() 內部緩存 [-128, 127] 範圍內的整數物件:

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

經典面試題解析

int i = 10;
Integer j = new Integer(10); // 強制新建物件
Integer k = 10;              // valueOf(10) → 緩存物件
Integer s = Integer.valueOf(10); // 緩存物件

System.out.println(i == j); // true  → 拆箱比較數值
System.out.println(j == k); // false → 記憶體位址不同
System.out.println(k == s); // true  → 同一緩存物件
System.out.println(j.equals(i)); // true → equals 比較數值

最佳實踐

  1. 永遠用 equals() 比較包裝類型數值,除非確定同一物件引用
  2. 避免在高頻迴圈中自動裝箱(產生大量臨時物件觸發 GC)
  3. 集合泛型優先用基本型別陣列或第三方庫(如 IntList)
  4. 可透過 -XX:AutoBoxCacheMax=size 擴大緩存上限(JDK 8+)

其他包裝類緩存範圍

類型緩存範圍
Byte-128 ~ 127 (全範圍)
Short-128 ~ 127
Integer-128 ~ 127
Long-128 ~ 127
Character0 ~ 127 (ASCII)
BooleanTRUE/FALSE 兩個單例
Float/Double無緩存
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved