为什么如果比较在java中不起作用

时间:2017-11-28 12:28:46

标签: java if-statement comparison assign

我在java中创建一个哈希表。 在搜索功能中,我在IF语句中进行了一些比较。但它没有做任何比较。

这是我代码的一部分。

while (table[pos]!=null) {
        if (table[pos]==key) {
            System.out.println("SEARCH "+key+" at INDEX "+home);
            return;
        }
        else {pos=h(home+p(i));
        i++;
        }
    }
    System.out.println("Failed to find "+key+".");
    return;
}

即使表[pos]和键相同,它也不起作用! 但我将非常简单的赋值变量添加到另一个变量。这行得通!我不知道它为什么会起作用。我想知道它xD

   while (table[pos]!=null) {
        int x = table[pos];
        if (x==key) {
            System.out.println("SEARCH "+key+" at INDEX "+home);
            return;
        }
        else {pos=h(home+p(i));
        i++;
        }
    }
    System.out.println("Failed to find "+key+".");
    return;
}

3 个答案:

答案 0 :(得分:7)

好吧,如果table[pos]key都是Integer(并且table[pos]必须是引用类型,因为您要将其与null进行比较while声明),应将其与equals进行比较,而不是与==进行比较,因为两个不同的Integer对象可能具有相同的int值。

当您将table[pos]分配给int变量x时,它会被取消显示为原始值。

现在,当您将int xInteger key进行比较时,key也会被取消加载到intint比较适用于==

这可以通过以下简短的例子来证明:

Integer i1 = 300;
Integer i2 = 300;
System.out.println (i1 == i2);
int i3 = i1;
System.out.println (i3 == i2);

输出:

false
true

代码如下:

while (table[pos] != null) {
    if (table[pos].equals(key)) {
        System.out.println("SEARCH "+key+" at INDEX "+home);
        return;
    } else {
        pos = h(home + p(i));
        i++;
    }
}
System.out.println("Failed to find "+key+".");

答案 1 :(得分:0)

将两个对象与==进行比较时,检查这两个引用是否都指向内存中的相同位置,而使用带有基元的==只检查值是否相同。要正确检查两个Integers内的值的等式,您应该使用equals()方法。

在您的第二个示例中,您使用了从Integerint的取消装箱,因此它按照您的预期检查了值。在第一个中,您比较了两个值是否指向内存中的相同位置。

答案 2 :(得分:0)

实际上,正确的方法是使用两者就像HashMap那样,这样我们总是可以肯定的。例如,HashMap在内部执行此操作:

if(((k = first.key) == key || (key != null && key.equals(k)))) ...

所以在你的情况下,它将是:

if ((table[pos] == key) || (key != null && (table[pos].equals(key)))) {