阅读本文大约需要3分钟, 文中代码来源于JDK1.8
我们先看一个现象
Integer a1 = 10;
Integer a2 = 10;
Integer b1 = 200;
Integer b2 = 200;
Integer c1 = new Integer(1);
Integer c2 = new Integer(1);
System.out.println(a1 == a2);// true
System.out.println(b1 == b2);// false
System.out.println(c1 == c2);// false
第一组为true,第三组由于使用了new,c1 和 c2 的地址必然不相等,但是第二组为什么是false呢?
首先,声明整数时,会通过 java.lang.Integer#valueOf(int) 构造,即 **Integer a=10其实就是Integer.valueOf(10) **,这点可以通过打断点或者查看class来验证
来看看valueOf
public static Integer valueOf(int i) {
// 当i 大于或等于 -128 且 小于或等于 127(缺省值)时,从Integer数组取值
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
// 否则,new一个出来
return new Integer(i);
}
上述代码块可以解释为什么 a1 == a2,而b1 != b2,因为200 已经超过 [-128, 127] 这个区间,需要new出来
再看看IntegerCache
可以看到 IntegerCache.high 是可以通过参数 java.lang.Integer.IntegerCache.high
指定的,而缺省值为127,我们来设置下VM参数
再次执行
最后,其实不仅仅是Integer,除了Boolean、Float、Double,其他包装类都使用了Cache。