可能重复:
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?
我尝试将两个整数与以下情况进行比较,并得出意想不到的结果
当我执行以下操作时,打印了@@@。
class C {
static Integer a = 127;
static Integer b = 127;
public static void main(String args[]){
if(a==b){
System.out.println("@@@");
}
}
}
当我执行以下操作时,@@@未打印。
class C {
static Integer a = 145;
static Integer b = 145;
public static void main(String args[]){
if(a==b){
System.out.println("@@@");
}
}
}
谁能告诉我可能是什么原因。
答案 0 :(得分:8)
您正在比较对象的身份。对于低于128的值,Integer类会缓存其对象。这就是为什么它在第一个例子中是相同的。另一个例子是没有缓存的更高值。
正如@niklon指出的那样,缓存的边界也为-128。
可以使用VM arg -Djava.lang.Integer.IntegerCache.high=4711
调整上边框。
进一步阅读彼得有趣的博文: http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html
答案 1 :(得分:5)
您不是在比较int
,而是在比较对象以获得引用相等性。使用.equals
,或使用int
类型代替Object
。
答案 2 :(得分:1)
这里使用Integer
个对象而不是int
个原语。因此,您应该将这两个实例与.equals(...)
进行比较,而不是==
。如果您使用的是原始类型,则可以使用==
。
值得注意的是,在处理对象时,==
会比较两个对象的引用,而不是实际值 - 因此有时可能会返回看似奇怪的结果。
答案 3 :(得分:1)
使用if(a.equals(b))
并且不要使用==
来比较作为Object类的子类的对象。
==
运算符仅用于原始类型,如int,long等。