Integer a = 1000, b = 1000;
System.out.println(a == b); // false
Integer c = 100, d = 100;
System.out.println(c == d); // true
JDK 源碼 Integer.java 內部類 IntegerCache 預緩存 [-128, 127] 範圍內的所有 Integer 對象。
代碼 Integer c = 100; 編譯器轉換為:
Integer c = Integer.valueOf(100);
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) 創建新對象(不同引用)| 類型 | 緩存範圍 |
|---|---|
| Byte | 全範圍 (-128 ~ 127) |
| Short | -128 ~ 127 |
| Integer | -128 ~ 127 |
| Long | -128 ~ 127 |
| Character | 0 ~ 127 (ASCII) |
| Boolean | TRUE/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()