问题引入
Integer a = 123;
Integer b = 123;
System.out.println(a==b);
结果为true。
但是如果代码如下
Integer a = 1230;
Integer b = 1230;
System.out.println(a==b);
这个的结果就是false。
问题解决
当Integer a = 123时,其实他底层自动转换成了Integer a = Integer.valueOf(123)。
然后他就会判断i的大小是否超过了IntegerCache的最小值和最大值。
最小值他设定的是-128,最大值是根据不同系统虚拟机决定的。一般来说是127。
如果i在这个范围之间,i的值就会放入cache静态数组中,所有对象共享同一个cache数组,如果不在就直接new一个新的对象。
如果放入cache数组中只要valueOf的还是i的值,他就共享为原来这个地址。
所以就出来了true的情况。
false的情况就是放入了超出范围的值,new了新的对象,所以比对的是地址,所以不同就很正常。