首先看例子:
Integer a1 = 128;
Integer a2 = 128;
System.out.println(a1 == a2); //f
Integer a3 = 127;
Integer a4 = 127;
System.out.println(a3 == a4); //t
Integer a5 =new Integer(127);
Integer a6 = new Integer(127);
System.out.println(a5 == a6); //f
Integer a7 = new Integer(127);
Integer a8 = 127;
System.out.println(a7 == a8); //f
Integer a51 =new Integer(127);
Integer a61 = new Integer(127);
System.out.println(a51.intValue() == a61.intValue()); //t
结果:
原因:
1、由于 Integer 变量实际上是对一个 Integer 对象的引用,所以两个通过 new 生成的 Integer 变量永远是不相等的,因为其内存地址是不同的;
2、Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进行比较时,会自动拆包装类为 int,然后进行比较,实际上就是两个 int 型变量在进行比较;
3、非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false。因为非 new 生成的 Integer 变量指向的是 Java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同;
4、对于两个非 new 生成的 Integer 对象进行比较时,如果两个变量的值在区间 [-128, 127] 之间,则比较结果为 true,否则为 false。Java在编译 Integer i = 100 时,会编译成 Integer i = Integer.valueOf(100)
其实就是java 包的缓存机制的问题。
new对象不涉及缓存问题。
= 赋值对象涉及的缓存并且包装类都是与int相关,如下
1.Byte 范围-128-127
2.Character 范围0-127
3.Short 范围-128-127
4.Integer 范围-128-127
5.Long 范围-128-127
缓存范围内会自动拆包装类为基本类型,就是比较的值。