【问题标题】:why if comparison doesn't work in java为什么如果比较在java中不起作用
【发布时间】:2018-05-11 21:56:22
【问题描述】:

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

即使 table[pos] 和 key 相同,它也不起作用! 但我将非常简单的分配变量添加到另一个变量。这行得通!我不知道为什么它有效。我想知道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;
}

【问题讨论】:

  • 您可能需要包含一个MCVE,以便我们现在知道您的确切问题是什么(目前似乎不清楚),包括输入、实际输出和预期输出以及一个演示的小型可执行示例问题本身。正确的代码格式也有助于更好地识别问题:)
  • “它没有做任何比较”是什么意思?逐行调试时发生了什么?

标签: java if-statement comparison assign


【解决方案1】:

好吧,如果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+".");

【讨论】:

  • 实际上并非如此。您应该同时使用==equals;第一个作为更快的检查。顺便说一句,这也是HashMap 在内部所做的:((k = first.key) == key || (key != null && key.equals(k))))
【解决方案2】:

当使用== 比较两个对象时,您检查这两个引用是否都指向内存中的同一位置,而将== 与原语一起使用只是检查值是否相同。要正确检查两个 Integers 内的值方程,您应该使用 equals() 方法。

在第二个示例中,您使用了从 Integerint 的拆箱,因此它会按照您的预期检查值。在第一个中,如果两个值都指向内存中的同一位置,则进行比较。

【讨论】:

    【解决方案3】:

    实际上正确的方法是使用 both 就像HashMap 一样,这样我们总是可以确定的。例如,HashMap 在内部是如何做到的:

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

    所以你的情况是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多