下面是一段经典的程序:
package com.aran.basicDataType;
/**
* @Author Aran
* @Date 2020/6/16 6:42 下午
*/
public class IntegerAndInt {
public static void main(String[] args) {
Integer v1 = 10;
Integer v2 = 10;
System.out.println(v1 == v2);
Integer v3 = 200;
Integer v4 = 200;
System.out.println(v3 == v4);
}
}
你说吧,会输出啥?大声说出来?
想不想直到结果?
想不想?
你就说想不想?
没错,你想对了,就是这样的:
输出:
true
false
这个要源于 Integer 与 int 的 自动装箱与自动拆箱 设计,重点来了:
对于值在 -127 ~ 128的值(这是int 的初始化范围),Integer = 10;这样的自动装箱操作会直接从int所初始化的常量池中进行取值,这么做是为了加大简单数字的重复利用。所以,上面的第一个输出就是true;
于是乎,第二个输出的结果也就可以理解了,Integer v3 = 200;相当于 Integer v3 = new Integer(200); Integer v4 = 200;相当于 Integer v4 = new Integer(200);
200 > 128 ,所以:他们会在栈中new 200,两个的地址不一样,所以当然不 ==
总结:
- 两个 new 出来的 Integer 进行比较,永远不会相等(内存地址不同)
- Integer 与int 比较时,会自动 对 Integer 进行 拆箱 操作,即实际是两个 int 进行比较,只要值相等,则比较结果相等
- 通过 Integer i = new Integer(aNumber) 与 Integer i = aNumber 的比较不会相等,因为当 -128 < i < 127 时,前者为 在内存中新建的对象,而后者来自常量池,内存地址不同,所以不相等;而不在这个范围时,两个都是在内存中新建的对象,地址也是不同的,所以也不会相等。
- 而两个 Integer i = aNumber 生成的数值,就要根据3中的范围来判断,如果在范围之内,则全部自动拆箱,取自常量池,值相等则相等,否则不会相等。
积跬步,至千里