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。
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);
}
}
Integer i = 100; 編譯器轉為 Integer.valueOf(100)-Djava.lang.Integer.IntegerCache.high=200 可擴大上限(下限固定 -128)| 類型 | 緩存範圍 |
|---|---|
| Byte | 全範圍 (-128~127) |
| Short | -128 ~ 127 |
| Integer | -128 ~ 127 (可調高) |
| Long | -128 ~ 127 |
| Character | 0 ~ 127 (ASCII) |
| Boolean | TRUE/FALSE 兩個單例 |
| Float/Double | 無緩存 |