如果運行如下代碼
Integer a = 1000, b = 1000;
System.out.println(a == b);
Integer c = 100, d = 100;
System.out.println(c == d);
你會得到下面的結果
false
true
我們知道 == 比較的是引用指向的對象是否相同,內存地址是否一樣。如果查看Integer的代碼就會發現當你聲明Integer a = 100;
實際上,運行的是Integer a = Integer.valueOf(100))
,繼續查看ValueOf函數
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
如果值在-128到127之間,它就會返回該緩存的實例。至此就明白了以上問題。下面就是個很有趣的例子.
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache);
newCache[132] = newCache[133];
int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b);