繁体   English   中英

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

[英]Java integers Return Strange Result While Compare Two Integers?

    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?

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

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

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

第二次回归真实

==对于基元使用是正确的: int是基元。

第三个是真的

正如JB Nizet指出的那样, i2取消装入一个int ,这使得if条件成为两个int原语之间的检查。

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

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

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

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

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

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

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

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

记住你不是比较2 primitives but 2 Objects ..所以使用.equals()方法..

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

i3i2的比较返回true,因为您将原始类型(int i3 )与该基本类型的包装类(Integer i2 )进行比较,因此Java将i2的值拆分为int然后进行比较(哪个与==运算符一起使用)。

在第一个如果 - 你比较两个对象 - 你是不同的。 Result = false in second - 您将比较两个int值。 结果是真的 - 你比较int和Integer,在拆箱后你有两个int。 结果 - 是的。 对于整数使用等于。

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

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

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

使用autocast, (int)i1==(int)i2将返回true,因此将(i1==i4)正如其他注释所解释的那样, ==仅比较对象(哪些引用按值传递)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM