我想解决一个问题.但是程序控制进入if语句,即使我检查的数字都是相同的,也不应该发生.是什么原因?
static int lonelyinteger(int[] a) {
Integer[] b=new Integer[a.length];
for(int i=0;i<a.length;i++){
b[i]=new Integer(a[i]);
}
int val=0;
Arrays.sort(b);
boolean flag=false;
for(int i=0;i<a.length-2;i+=2)
if (b[i]!=b[i+1]){
val=b[i];
flag=true;
break;
}
if(flag==true)
return val;
else
return b[a.length-1];
Run Code Online (Sandbox Code Playgroud)
您正在使用!=的Integer对象.这只适用于-128和127(引用)之间的整数值,因为它们由JVM缓存.但它不适用于更大/更小的值.而是使用.equals
if (!b[i].equals(b[i+1])){
val=b[i];
flag=true;
break;
}
Run Code Online (Sandbox Code Playgroud)
正如Jesper在注释中正确指出的那样,当您强制JVM通过显式调用构造函数来创建新的Integer对象时,不会使用Integer JVM 用于对象的缓存.调用构造函数会创建新的实例,而不是返回缓存的情况下,这意味着与该检查两个对象是否是相同的实例将始终觉得情况是不同的.new Integer(value)IntegerInteger!===