先來看道題
int a=100;
int b=100;
Integer c=a;
Integer d=b;
System.out.println(a==b);
System.out.println(c==d);
其實這道題 和 a 與 b 沒有什麼關係,可以直接看成
Integer c=100;
Integer d=100;
System.out.println(c==d);
執行結果爲 true
當是如果把題目改爲
Integer c=200;
Integer d=200;
System.out.println(c==d);
執行結果卻爲false
這是爲什麼呢?
這就涉及到 Integer 的自動裝箱了,
我們都知道Integer是一個 類 不是基本類型數據,但是爲什麼它可以直接像基本類型數據一樣可以直接賦值.
這是在jdk1.5 之後引入的 自動裝箱和自動拆箱.
上面的問題實際上是使用了 Integer.valueOf()進行自動裝箱的.
等同於
Integer c=Integer.valueOf(100);
對於爲什麼上面兩個問題的執行結果會有不同,我們就需要看 Integer.valueOf()的源碼了
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache.high和IntegerCache.low默認分別爲 127 和-128
如果傳入的值是在-128~127之間就會建立Integer實例並且把實例放入緩存中,
當再傳入的值是緩存中存在的,就會把緩存中的實例返回.
如果不在 -128~127之間就不會把 實例放入緩存中.直接返回一個實例.
內容部分參考java jdk7 學習筆記