我知道如果你比较一个装箱的原语Integer和一个常量,比如:
Integer a = 4;
if (a < 5)
A将自动被打开,比较将会起作用。
但是,当您比较两个带框的整数并希望比较相等或小于/大于时会发生什么?
Integer a = 4;
Integer b = 5;
if (a == b)
上面的代码是否会检查它们是否是同一个对象,或者在这种情况下它会自动开箱吗?
是什么:
Integer a = 4;
Integer b = 5;
if (a < b)
?
这个方法用空检查比较两个Integer。请参阅测试。
public static boolean compare(Integer int1, Integer int2) {
if(int1!=null) {
return int1.equals(int2);
} else {
return int2==null;
}
//inline version:
//return (int1!=null) ? int1.equals(int2) : int2==null;
}
//results:
System.out.println(compare(1,1)); //true
System.out.println(compare(0,1)); //false
System.out.println(compare(1,0)); //false
System.out.println(compare(null,0)); //false
System.out.println(compare(0,null)); //false
System.out.println(compare(null,null)); //true
调用
if (a == b)
大部分时间都有效,但不能保证总是有效,所以不要使用它。
比较两个Integer类是否相等的最合适的方法是,假设它们分别命名为'a'和'b',调用:
if(a != null && a.equals(b)) {
System.out.println("They are equal");
}
你也可以用这种稍微快一点的方法。
if(a != null && b != null && (a.intValue() == b.intValue())) {
System.out.println("They are equal");
}
在我的机器上,使用第一种方法执行990亿次操作需要47秒,使用第二种方法需要46秒。您需要比较数十亿个值才能看到任何差异。
注意,'a'可能是空的,因为它是一个对象。以这种方式进行比较不会导致空指针异常。
用于比较大于和小于,使用
if (a != null && b!=null) {
int compareValue = a.compareTo(b);
if (compareValue > 0) {
System.out.println("a is greater than b");
} else if (compareValue < 0) {
System.out.println("b is greater than a");
} else {
System.out.println("a and b are equal");
}
} else {
System.out.println("a or b is null, cannot compare");
}