int vs Integer比较Java

class datatype1 { public static void main(String args[]) { int i1 = 1; Integer i2 = 1; Integer i3 = new Integer(1); System.out.println("i1 == i2"+(i1==i2)); System.out.println("i1 == i3"+(i1==i3)); System.out.println("i2 == i3"+(i2==i3)); } } 

产量

 i1 == i2true i1 == i3true i2 == i3false 

有人可以解释为什么我在比较i2和i3时会出错吗?

 i1 == i2 

导致解除绑定并进行常规的int比较。 (参见JLS 5.6.2中的第一点 )

 i2 == i3 

结果参考比较 。 请记住, i2i3是两个不同的对象。 (见JLS 15.21.3 )

 Integer i2 = 1; 

这个结果是自动装箱。 您正在将int(基本类型)转换为它的相应包装器。

  Integer i3 = new Integer(1); 

您不需要自动装箱,因为您直接创建了一个Integer对象。

现在进来

 i1 == i2 i1 == i3 

i2和i3会自动取消装箱,并且会进行常规的int比较,这就是为什么你会变成现实。

现在考虑

 i2 == i3 

这里i2和i3都是你要比较的Integer对象。 由于两者都是不同的对象(因为你使用了new运算符),它显然会给出错误。 注意==运算符检查两个引用是否指向同一对象。 事实上.equals()方法如果没有被覆盖就会做同样的事情。

这跟说的一样

  Integer i2 = new Integer(1); Integer i3 = new Integer(1); System.out.println("i2 == i3 "+(i2==i3)); 

这将再次给你假。