先来看一段代码:
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的结果就很好解析了。
本文通过一段Java代码的输出结果,深入探讨了Integer缓存的工作原理。解释了当Integer值在-128到127之间时,使用缓存而非新建对象的原因,从而解析了代码中比较操作符==为何在某些情况下返回true,在另一些情况下返回false。
4536

被折叠的 条评论
为什么被折叠?



