繁体   English   中英

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

[英]why if comparison doesn't work in java

我在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;
}

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

table[pos]分配给int变量x ,它将取消框为原始值。

现在,当您将int xInteger key进行比较时,该key也将取消装入int ,并且int比较适用于==

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

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+".");

当使用==比较两个对象时,检查这两个引用是否指向内存中的相同位置,而使用== with primitives只检查值是否相同。 要正确检查两个Integers内的值的等式,您应该使用equals()方法。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM