int vs Integer比较Java

时间:2013-08-26 13:19:57

标签: 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时会出错吗?

2 个答案:

答案 0 :(得分:57)

i1 == i2

得到un-boxing并进行常规的int比较。 (见first point in JLS 5.6.2

i2 == i3 

结果为reference comparsion。请记住,i2i3是两个不同的对象。 (见JLS 15.21.3

答案 1 :(得分:13)

Integer i2 = 1;

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

 Integer i3 = new Integer(1);

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

现在在

i1 == i2
i1 == i3

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

现在考虑

i2 == i3

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

与说法相同

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

这将再次给你假。