如果运行如下代码
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);