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?
答案 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)
变量i1
和i2
指的是对象,而不是基本类型。在Java中的对象上使用==
运算符检查引用是否相等,如果要比较它们,则应使用.equals()
方法。
i3
和i2
的比较返回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,如果您只想检查是否相等。