int vs Integer比较Java

Und*_*Dog 31 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));
}

}
Run Code Online (Sandbox Code Playgroud)

产量

i1 == i2true
i1 == i3true
i2 == i3false
Run Code Online (Sandbox Code Playgroud)

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

roc*_*boy 60

i1 == i2
Run Code Online (Sandbox Code Playgroud)

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

i2 == i3 
Run Code Online (Sandbox Code Playgroud)

结果参考比较.请记住,i2并且i3是两个不同的对象.(见JLS 15.21.3)

  • 别忘了提到`Integer.valueOf(1)`会导致`true`,因为Java会使用整数缓存 (4认同)

Ani*_*kur 13

Integer i2 = 1;
Run Code Online (Sandbox Code Playgroud)

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

 Integer i3 = new Integer(1);
Run Code Online (Sandbox Code Playgroud)

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

现在进来

i1 == i2
i1 == i3
Run Code Online (Sandbox Code Playgroud)

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

现在考虑

i2 == i3
Run Code Online (Sandbox Code Playgroud)

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

这跟说的一样

    Integer i2 = new Integer(1);
    Integer i3 = new Integer(1);
    System.out.println("i2 == i3 "+(i2==i3));
Run Code Online (Sandbox Code Playgroud)

这将再次给你假.

  • 为此道歉,但没有投票,任何人都可以编辑它. (3认同)
  • "如果没有覆盖,事实上.equals()方法会做同样的事情." 不确定你的意思.如果你用i2.equals(i3)测试最后一段代码; 它返回true.所以我不同意它做同样的事情...... (2认同)