Java中的int和Integer比较问题

39
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 时我得到了 false 吗?


1
你正在比较指针,而不是值... - Anders R. Bystrup
12
引用而非指针。 - chrylis -cautiouslyoptimistic-
4
为什么这样的问题会得到赞成? - The Governor
5
为什么不可以呢? - arshajii
2个回答

75

6
别忘了提到 Integer.valueOf(1) 的结果会是 true,因为 Java 会使用整数缓存。 - durron597
@durron597,没错伙计.. - Rakesh KR

13
Integer i2 = 1;

这是自动装箱的结果。您将int(原始类型)转换为其对应的包装器。

 Integer i3 = new Integer(1);

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

现在在

i1 == i2
i1 == i3

i2和i3会自动取消装箱并进行常规整数比较,这就是为什么会得到true的原因。

现在考虑

i2 == i3

这里你在比较两个整数对象i2和i3。由于你使用了new运算符,它们是两个不同的对象,因此显然会返回false。请注意,==运算符检查两个引用是否指向同一个对象。实际上,如果没有重写,.equals()方法也会执行相同的操作。

这就像是说

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

这会再次给你错误的结果。


复制粘贴错误,你的第二行代码与第一行相同。 - Marc-Andre
3
抱歉造成困扰,但是除了给别人投反对票之外,任何人都可以编辑它。 - Aniket Thakur
我不是那个给你点踩的人,我只是想说,乍一看似乎有些错误。但这个问题对我来说太小了,不值得我去编辑! - Marc-Andre
3
实际上,如果未覆盖重写.equals()方法,则会执行相同的操作。不确定您的意思。如果您使用i2.equals(i3)测试代码的最后一行片段,则会返回true。因此,我不同意它执行相同的操作... - Mark
我同意马克的说法,我测试了那行代码,没有任何重写,.equals() 返回了 true。 - austinkjensen
我认为重点是Object.equals()与==运算符一样进行引用比较。但是Integer.equals()覆盖了它,并进行适当的整数比较。 - Ilya Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接