今天突然發現一個特別有意思的事,就是使用java的Integer的比較出現一個問題,就是使用 ==(引用的比較),並沒有獲取到我們想要的結果
一、== 和 equals的區別
我們知道Java有兩種類,一種是原始類,例如int,long等,還有包裝類Integer,Long等,在比較原始類時我們使用 ==
來比較,比較的是值,比較包裝類時使用 equals
來比較值,用 ==
比較引用,這些我們都是知道的,但是今天發現的有點顛覆我的三觀。
二、== 的比較
例子如下
public static void main(String... strings) {
Integer integer1 = Integer.valueOf(3);
Integer integer2 = Integer.valueOf(3);
if (integer1 == integer2) {
System.out.println("integer1 == integer2");
} else {
System.out.println("integer1 != integer2");
}
Integer integer3 = Integer.valueOf(500);
Integer integer4 = Integer.valueOf(500);
if (integer3 == integer4) {
System.out.println("integer3 == integer4");
} else {
System.out.println("integer3 != integer4");
}
}
比較的結果:
integer1 == integer2
integer3 != integer4
結果並不是我認爲的都是false
是發生了bug了嗎,我去看了源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
從這裏我們可以看出值的取值方式是從緩存裏取得,默認區間是-128到127.從這裏可以看出值是從緩存的列表裏去,值相同時引用也是一樣,當超出這個範圍時纔會創建新對象。
所以這裏的坑需要記住。
參考文檔 :http://www.codeceo.com/article/java-integer-cache.html