我知道如果你比较一个装箱的原语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)
?
我们应该总是使用equals()方法来比较两个整数。这是推荐的做法。
如果我们使用==比较两个整数,由于JVM的内部优化,这将适用于一定范围的整数值(从-128到127的整数值)。
请看例子:
案例1:
Integer a = 100;
Integer b = 100;
if (a == b) {
System.out.println("a and b are equal");
} else {
System.out.println("a and b are not equal");
}
在上述情况下,JVM从缓存池中使用a和b的值,并返回相同的对象实例(因此内存地址)的整数对象,我们得到两者相等。它是JVM为特定范围值所做的优化。
情况2:在这种情况下,a和b不相等,因为它没有从-128到127的范围。
Integer a = 220;
Integer b = 220;
if (a == b) {
System.out.println("a and b are equal");
} else {
System.out.println("a and b are not equal");
}
正确的方法:
Integer a = 200;
Integer b = 200;
System.out.println("a == b? " + a.equals(b)); // true
因为比较方法必须基于类型int (x==y)或类Integer (x= (y)),并使用正确的操作符:
public class Example {
public static void main(String[] args) {
int[] arr = {-32735, -32735, -32700, -32645, -32645, -32560, -32560};
for(int j=1; j<arr.length-1; j++)
if((arr[j-1] != arr[j]) && (arr[j] != arr[j+1]))
System.out.println("int>" + arr[j]);
Integer[] I_arr = {-32735, -32735, -32700, -32645, -32645, -32560, -32560};
for(int j=1; j<I_arr.length-1; j++)
if((!I_arr[j-1].equals(I_arr[j])) && (!I_arr[j].equals(I_arr[j+1])))
System.out.println("Interger>" + I_arr[j]);
}
}
我们应该总是使用equals()方法来比较两个整数。这是推荐的做法。
如果我们使用==比较两个整数,由于JVM的内部优化,这将适用于一定范围的整数值(从-128到127的整数值)。
请看例子:
案例1:
Integer a = 100;
Integer b = 100;
if (a == b) {
System.out.println("a and b are equal");
} else {
System.out.println("a and b are not equal");
}
在上述情况下,JVM从缓存池中使用a和b的值,并返回相同的对象实例(因此内存地址)的整数对象,我们得到两者相等。它是JVM为特定范围值所做的优化。
情况2:在这种情况下,a和b不相等,因为它没有从-128到127的范围。
Integer a = 220;
Integer b = 220;
if (a == b) {
System.out.println("a and b are equal");
} else {
System.out.println("a and b are not equal");
}
正确的方法:
Integer a = 200;
Integer b = 200;
System.out.println("a == b? " + a.equals(b)); // true
这个方法用空检查比较两个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