Java整数在比较两个整数时返回奇怪的结果?

时间:2012-02-24 10:29:58

标签: java android

    Integer i1= new Integer(9);
    Integer i2= new Integer(9);

    if(i1==i2){
        System.out.println("true");
    }else{
        System.out.println("false");
    }


    int i3=9;
    int i4=9;

    if(i3==i4){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

    if(i3==i2){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

在上面的代码中首先if-else打印为false,为什么?。但是当第二次返回true而第三次都是true时。我认为包装类(如double,boolean,char)不能比较True?

10 个答案:

答案 0 :(得分:6)

  

首先if-else打印为false。为什么呢?

==检查两个引用是否引用同一个对象,在这种情况下它们不是==检查false。您需要使用Integer.equals(),而不是==

if (i1.equals(i2){
    System.out.println("true");
}else{
    System.out.println("false");
}
  

第二次返回true

==用于原语是正确的:int是原语。

  第三个是真的

JB Nizet i2指出int if int,{{1}}条件在两个{{1}}基元之间进行检查。

答案 1 :(得分:6)

==用于比较对象的引用时,仅当两个引用都指向同一个对象时才返回true。

在第一种情况下,您有两个不同的对象。

在第二种情况下,您不是在比较对象,而是在比较原始类型。

在第三种情况下,Integer对象被取消装箱到其原始int值以与原始值进行比较,因此会比较两个原始值。

除了枚举之外,你绝不应该使用==来比较对象。始终使用.equals()

答案 2 :(得分:2)

每当使用“==”时,您正在进行对象引用检查。这意味着,第一次检查将失败,因为它们是2个不同的对象。

在第二种情况下,它直截了当。

在第三种情况下,编译器自动装箱“i2”。所以,比较会很好。

答案 3 :(得分:2)

请记住,您没有比较2 primitives but 2 Objects ..所以请使用.equals()方法..

答案 4 :(得分:0)

变量i1i2指的是对象,而不是基本类型。在Java中的对象上使用==运算符检查引用是否相等,如果要比较它们,则应使用.equals()方法。

i3i2的比较返回true,因为您正在将基本类型(int i3)与该基本类型的包装类(整数{{1}进行比较因此,Java将i2的值重新打包为i2,然后对它们进行比较(它与int运算符一起使用)。

答案 5 :(得分:0)

在第一个if中 - 你比较两个对象 - 它们是不同的。结果= false 在第二个 - 你比较两个int值。结果是真的 in therd - 你比较int和Integer,在拆箱后你有两个int。结果 - 是的。 对于整数使用等于。

答案 6 :(得分:0)

第一种情况,JVM检查i1和i2是否都是相同的引用。因为它们不同所以它会导致错误。

第二种情况,没有问题,因为它们都是原始数据类型并且具有相同的值,所以它是真的。

在第三种情况下,i2首先被自动装箱,然后进行比较,结果是真的。

答案 7 :(得分:0)

使用自动广播,(int)i1==(int)i2将返回true,(i1==i4)也将返回 正如其他评论所解释的那样,==仅比较对象(哪些引用按值传递)

答案 8 :(得分:0)

另一种“安全”和替代方式是使用模运算

 if ( ( i3%i4)==0) System.out.println("true");

答案 9 :(得分:-1)

运算符==正在检查两个REFERENCES是否相等。在您的示例中,您实例化了两个不同类型为integer的对象,然后询问它们是否相同。

如果要比较Integer-Objects的值,请使用.compare()函数或.equals,如果您只想检查是否相等。