[英]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?
当==
用于比较对象的引用时,仅当两个引用都指向同一个对象时,它才返回true。
在第一种情况下,您有两个不同的对象。
在第二种情况下,您不是比较对象,而是比较基本类型。
在第三种情况下, Integer
对象被取消装箱到其原始int
值以与原始值进行比较,因此比较了两个原始值。
除了枚举之外,你绝不应该使用==
来比较对象。 始终使用.equals()
。
无论何时使用“==”,您都要进行对象引用检查。 这意味着,第一次检查将失败,因为它们是2个不同的对象。
在第二种情况下,它直截了当。
在第三种情况下,编译器自动装箱“i2”。 所以,比较会很好。
记住你不是比较2 primitives but 2 Objects
..所以使用.equals()
方法..
变量i1
和i2
指的是对象,而不是基本类型。 在Java中的对象上使用==
运算符检查引用是否相等,如果要比较它们,则应使用.equals()
方法。
i3
和i2
的比较返回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.