話不多說,直接看題
@Test
public void inspectInteger(){
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
Integer i5 = 300;
Integer i6 = 300;
Integer i7 = 1000;
Integer i8 = 1000;
System.out.println(i1==i2); //true
System.out.println(i3==i4); //false
System.out.println(i5==i6); //false
System.out.println(i7==i8); //false
}
默認理解 :
JAVA 用對象創建,默認是引用內存地址,所以 == 判斷地址,正常不應該為:true
通過多次對比,我們發現只有值為100時候,不符合我們的邏輯,其它的都為:false
所以:到底是我們對==理解有誤,還是值為:100的時候搞鬼了。通常我們有疑惑就得去驗證。
直接看Integer 源碼 ,
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
//從這里可以看到,能夠Vm配置參數,設置最大值
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) { //當有外部參數輸入時候
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127); //對比,誰大返回誰
//
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //對比,外部配置值,是否超出了int范圍
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// 范圍 [-128,127] 必須被拘禁
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
源碼中有個內部類 IntegerCache 從名字上就可以判斷: 整型緩存
可以看到使用了一個Integer[] 數組方式進行緩存 ,而且可以使用VM外部設置: 最大屬性值
默認范圍 -128 ~ 127 所以 : 也就是說 在這個范圍內的 == 都可以為true
把整數常量int 賦值 給 整數對象 Integer 類型,實際上調用了Integer.valueOf方法,通過源碼也可以看到
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //在范圍內的,直接從cache獲取
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i); //否則,則new
}
好處:
為什么要這么設計,一個東西誕生不會無緣無故,目前看到說法都是 -128 ~127 比較常用,這樣可以提高效率
