我们先来看一段代码:
public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);
Integer f1 = 100, f2 = 100;
Integer f3 = 200;
Integer f4 = 200;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
System.out.println(f3 == (f1 + f2));
}
}
运行结果:
false
true
true
false
true
我们一个一个来看:
a==b :false
原因:因为对与对象来说 “==” 判断的依据是两个对象的地址是否相等,显然a是新建的对象和b自动包装出来的堆相指向的不是同一个地址,所以为false。
a==c :true
因为c是一个基本类型的数据,包装类Integer和基本类型的数据在比对时会自动拆箱(调用Integer的intValue()方法)进行比较,即使用a对象的数值和基本类型c进行数值大小的比较。
f1==f2 :true
因为Integer是有一个缓存机制的,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间
,所以在自动包装对象调用valueOf方法时,数值在-128-127之间会直接返回缓存池中的对象。f1,f2都是小于127大于-128的数值,所以引用的对象地址也是一样的。
f3==f4的答案:false
同样是因为上面的原因,f3和f4都是新建的Integer对象,所以对象地址不同,答案是false。
f3==(f1+f2)的答案:true
因为Integer对象之间在执行符号运算时,会自动拆箱,所以f1+f2是其对象数值的相加,得到的结果是int类型的200,此时再次和f3进行比较,因为200是int类型的基本类型数据,所以f3也会进行自动拆箱,和之前运算得到的200进行比较,值相等,结果为true。