有一個很經(jīng)典的問題如下:
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);
都知道第一個答案是true第二個答案是false,為什么呢?
這里就涉及到j(luò)ava語言的拆箱和裝箱操作了,Integer c=128 這個賦值操作其實是這樣的,128是個int,要想賦值給包裝類型Integer就須要進行裝箱操作,調(diào)用到的是Integer.valueOf(int i)方法,我們可以看看這個方法的源碼:

如果這個i值在IntegerCache.low與IntegerCache.high之間,那么就會返回IntegerCache類中的一個緩存數(shù)組中的值,說白了就是Integer其實會把一些數(shù)字進行緩存,其它的數(shù)字才會進行new Integer()操作,這就很好解釋了為嘛一個是true一個是false了,另外還說一點,IntegerCache中定義了low是-128,是一個固定值,但是high并沒有固定,只是JLS中規(guī)定至少要127,所以如果你主動修改vm options的話是可以把high變的更大的,如果大于128了那么128也會緩存,這樣的話,結(jié)果就是true了。

