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

Java 整數緩存機制揭秘:為什麼 1000==1000 為 false 而 100==100 為 true?

     編輯:Java 相關知識

現象演示

Integer a = 1000, b = 1000;
System.out.println(a == b); // false

Integer c = 100, d = 100;
System.out.println(c == d); // true

核心原因:IntegerCache 緩存池

JDK 源碼 Integer.java 內部類 IntegerCache 預緩存 [-128, 127] 範圍內的所有 Integer 對象。

自動裝箱過程

代碼 Integer c = 100; 編譯器轉換為:

Integer c = Integer.valueOf(100);

valueOf 實現邏輯

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)  // -128 ~ 127
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  • 範圍內:直接返回緩存池對象(同一引用)
  • 範圍外:new Integer(i) 創建新對象(不同引用)

為什麼要緩存?

  • 性能:小整數使用頻率極高,復用對象減少內存分配/GC 壓力
  • 內存:避免大量重複小對象佔用堆空間

其他基本類型緩存範圍

類型緩存範圍
Byte全範圍 (-128 ~ 127)
Short-128 ~ 127
Integer-128 ~ 127
Long-128 ~ 127
Character0 ~ 127 (ASCII)
BooleanTRUE/FALSE 兩個單例
Float/Double無緩存

進階:通過反射修改緩存(僅供理解,生產嚴禁)

Class<?> cacheClass = Integer.class.getDeclaredClasses()[0]; // IntegerCache
Field cacheField = cacheClass.getDeclaredField("cache");
cacheField.setAccessible(true);
Integer[] cache = (Integer[]) cacheField.get(cacheClass);
cache[132] = cache[133]; // 將 4 映射到 5 的緩存位置

int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b); // 輸出: 2 + 2 = 5
⚠️ 僅演示緩存機制,生產代碼絕對禁止此類操作,會破壞 JDK 基礎語義,導致不可預測後果。

最佳實踐

  • **整數比較永遠用 equals()**,不依賴 ==
  • 理解自動裝箱/拆箱性能開銷,熱點循環優先用基本類型
  • 大數據量場景考慮 Integer.valueOf() 替代 new Integer()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved