36
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 时会出错吗?

4

2 回答 2

72
i1 == i2

导致取消装箱并完成常规的 int 比较。(见JLS 5.6.2 中的第一点

i2 == i3 

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

于 2013-08-26T13:21:37.463 回答
13
Integer i2 = 1;

这个结果是自动装箱。您正在将 int(primitive type) 转换为其相应的包装器。

 Integer i3 = new Integer(1);

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

现在在

i1 == i2
i1 == i3

i2 和 i3 会自动拆箱,并且会定期进行 int 比较,这就是您得到真实的原因。

现在考虑

i2 == i3

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

和说的一样

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

这将再次给你虚假。

于 2013-08-26T13:32:28.633 回答