Java-trouble不等于

mah*_*der 1 java

我想解决一个问题.但是程序控制进入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)

cyo*_*yon 7

您正在使用!=Integer对象.这只适用于-128127(引用)之间的整数值,因为它们由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!===

  • 并且`!=`和`==`将返回`false`,即使在`-128`和`127`之间的值也是如此,因为他用`new`明确地创建了新的`Integer`对象. (7认同)