Integer i1 = 127;
Integer i2 = 127;
if(i1==i2){
System.out.println("true"); //prints true
}else{
System.out.println("false");
}
Integer i3 = 128;
Integer i4 = 128;
if(i3==i4){
System.out.println("true");
}else{
System.out.println("false"); //prints false
}
为什么如果Integer值小于127则返回true,否则返回false。如果是原始值,则返回true。
或者如果我创建Integer i2 = new Integer(1);
这总是返回false。
答案 0 :(得分:10)
您正在检查身份。 Java保留一个整数池,介于-128和127之间。其他整数是动态创建的,因此它们彼此不同。正如@ sarwar026所说,你应该使用.equals()
。
答案 1 :(得分:1)
您应该使用.equals()
代替==
。在这种情况下,您的两个代码都应打印true
if(i1.equals(i2)){
System.out.println("true");
}else{
System.out.println("false");
}
答案 2 :(得分:1)
使用i1.equals(i2)
与Integer进行比较
<强> WHY 强>
因为当您使用==
比较两个整数时,将比较参考对象而不是值。但是当你使用equals
方法比较它们时,他们正在比较值
但是,为什么它在
之前有效正如Elazar已经建议的那样,java使用256(-128到127)长整数池。 pool表示所有已定义的int都存储在某个“池”中。所以对于整数池的值,它返回true。但是,对于更大的值,动态创建整数,因此它不显示真实。
Primitive int怎么样
在原始类型中没有像上面那样的复杂性。因此,您始终可以使用==
答案 3 :(得分:0)
使用Integer.equals()
方法检查值是否相等。这是因为缓存了最多128个值。因此,JVM为您提供相同的对象,从而对象进行比较。但是大于128的值会创建一个新实例而不使用缓存的实例。
答案 4 :(得分:0)
首先,我们需要通过equals()进行检查,以便在引用的情况下比较值。 但是通过“==”,它会比较引用而不是它保留的值。
如果您在Integer类中查看以下方法,则可以知道。
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
所以当值大于127时,它没有采用相同的参考。因此在第二种情况下结果是错误的。