先来看一段代码:
public class Demo1{
public static voidmain(String[] args){
Integer x = 127;
Integer y = 127;
Integer j = 128;
Integer k = 128;
System.out.println(x == y);
System.out.println(j == k);
}
}
输出是 true
false
一开始我很纳闷,于是先反编译一波Demo1.class,得到源码如下:
public class Demo1{
public static void main(String args[])
{
Integer x = Integer.valueOf(127);
Integer y = Integer.valueOf(127);
Integer j = Integer.valueOf(128);
Integer k = Integer.valueOf(128);
System.out.println(x == y);
System.out.println(j == k);
}
}
可以看到java对代码进行了拆箱操作,那我们就来看看这个拆箱操作具体干了啥,只有这样,我们才能解析上面的输出。
查看JDK1.8的Integer.valueOf(int i)方法,得到源码如下:
public staticInteger valueOf(int i) {
if (i >= IntegerCache.low&& i <= IntegerCache.high)
return IntegerCache.cache[i+ (-IntegerCache.low)];
return new Integer(i);
}
对该代码说明如下:
IntegerCache是Integer的一个私有静态内部类,其中low的值为-128,high的值为127;因此,若我们输入的数值在-128到127之间时,返回的是一个缓存数组中的某个值,当我们输入的值不在这个范围时,则new 一个Integer对象返回。说到这,上面为啥输出true,false的结果就很好解析了。