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

Integer 緩存機制揭秘:-128 到 127 之間 == 比較為何為 true

     編輯:Java 綜合教學

Integer 緩存機制揭秘:-128 到 127 之間 == 比較為何為 true

現象驗證


Integer a = -129, a1 = -129;  // a == a1 → false
Integer aa = -128, aa1 = -128; // aa == aa1 → true
Integer b = 128, b1 = 128;     // b == b1 → false
Integer c = 127, cc = 127;     // c == cc → true
Integer d = 1, dd = 1;         // d == dd → true

// new 出來的永遠不相等
Integer aaa = new Integer(-129);
aaa == a1; // false

// Integer 與 int 比較:自動拆箱比值
Integer e = 128; int e1 = 128; // e == e1 → true

結論

Integer 類型值在 [-128, 127] 範圍內,使用 == 比較為 true;超出範圍或 new 出來的對象,== 比較為 false。
Integer 與 int 比較時自動拆箱為基本類型比值,結果為 true。

源碼級解析:Integer.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);
}

IntegerCache 靜態初始化:


private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer[] cache;
    
    static {
        int h = 127;
        String prop = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (prop != null) {
            try { h = Integer.parseInt(prop); } catch (NumberFormatException ignored) {}
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        for (int i = low; i <= high; i++) cache[i - low] = new Integer(i);
    }
}

關鍵點總結

  1. 自動裝箱調用 valueOf():Integer i = 100; 編譯器轉為 Integer.valueOf(100)
  2. 緩存範圍可配置:啟動參數 -Djava.lang.Integer.IntegerCache.high=200 可擴大上限(下限固定 -128)
  3. new Integer() 繞過緩存:每次新建對象,== 永遠 false
  4. == 比較引用,equals() 比值:緩存區間內引用相同,故 == 為 true
  5. Integer == int 自動拆箱:比較數值而非引用

最佳實踐

  • 永遠使用 equals() 比較包裝類型數值
  • 避免在邏輯判斷中依賴 == 的緩存行為(實現細節可能變更)
  • 高頻創建 Integer 考慮緩存池調優或使用基本類型 int

延伸:其他包裝類緩存範圍

類型緩存範圍
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