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

Java Integer 緩存機制:為何 100 == 100 為 true,200 == 200 為 false?

     編輯:程式設計疑難解答

現象

Integer a = 100, b = 100; // true
Integer c = 200, d = 200; // false

根因:IntegerCache

JDK 在 `Integer.valueOf(int)` 中對 **[-128, 127]** 範圍內的整數進行**緩存**(單例模式),超出範圍則 `new Integer(i)` 創建新對象。

// JDK 8 Integer.valueOf 簡化邏輯
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

// 緩存範圍默認 -128 到 127,可通過 -XX:AutoBoxCacheMax=N 調大上限

四條語句解析

語句結果原因
`a == b` (100)true自動拆箱/裝箱調用 `valueOf(100)`,命中緩存,同一對象引用。
`a == 100`true基本類型 `int` 與 `Integer` 比較,`Integer` 自動**拆箱**為 `int`,值比較。
`c == d` (200)false200 超出緩存範圍,兩次 `new Integer(200)`,引用不同。
`c == 200`true同第二條,`Integer` 拆箱為 `int` 比較值。

最佳實踐

  • **整數比較永遠用 `.equals()` 或拆箱後 `==`**,切勿依賴緩存行為。
  • `Integer` 緩存範圍可調:`-XX:AutoBoxCacheMax=10000`(僅影響上限,下限固定 -128)。
  • `Long`、`Short`、`Byte`、`Character` 同理有各自緩存(`Byte` 全範圍緩存 -128~127)。
  • 避免在高頻循環中大量 `new Integer()` / 自動裝箱,造成 GC 壓力;用基本類型 `int` 或對象池。

**核心口訣:裝箱找緩存,拆箱比值;超出範圍新對象,引用比較靠邊站。**

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