Integer 是Java中的包装类,通常情况下,两个相同值的Integer对象实例用 “==” 运算符进行比较时,返回结果应该是false,但是实际情况却不是这样。
public static void main(String[] agrs){
Integer integer1 = 1;
Integer integer2 = 1;
System.out.println(integer1==integer2);
}
复制代码
运行结果:
这是为什么?
但是稍微改动一下情况就会不同:
public static void main(String[] agrs){
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1==integer2);
}
复制代码
运行结果:
可以注意到,这两段程序的不同之处仅仅在integer的值上,一个的值是 1 ,另外一个是 128,比较起来的结果完全不同。
这是为什么?
单步调试看一下:
当赋值128时:
Integer = 128 赋值操作得时候跳到了valueOf函数:
在这个if语句中 low和high的值分别是-128和127,所以最后返回给integer1的时候返回的就是一个新的Integer对象实例,在堆中开辟了新的空间,所以 “==” 的结果理所当然是false,也就是预期结果。
当赋值1时:
Integer = 1 赋值操作得时候也跳到了valueOf函数:
那么这个时候由于1在-128到127之间,所以返回的是 IntegerCache.cache 数组里的对象,从源码中可以看到,cache数组的定义如下:
而这段代码是存在于静态代码块里的:
也就是说:在Integer类被加载之后,cache数组就被初始化成了一个储存了-128~127的顺序的Integer数组,按照上面的代码逻辑,所有用 “=” 赋值的操作,如果值在-128~127之间,实际上指向的都是同一个位置。所以 “==” 的返回值是true