Java:如何测试数组相等性?

2022-08-31 23:55:50

为什么打印以下代码?"Different."

boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

答案 1

为什么以下代码打印“不同”

因为 Arrays.equals 执行浅层比较。由于数组继承了它们的 -method ,因此将为内部数组执行标识比较,这将失败,因为 并且不引用相同的数组。equalsObjectab

如果更改为 Arrays.deepEquals,它将按预期方式打印。"Equal."


答案 2

这真的不明显。

首先,操作员只需比较两个指针。因为和是位于不同内存地址的不同对象,会返回(嘿,Java纯粹主义者,我知道实际上比较对象身份。我只是想说教)。==aba == bfalse==

现在让我们看一下数组的实现:equals()

boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };

if (c.equals(d)) {
    System.out.println("Equals");
} else {
    System.out.println("Not equals");
}

这将打印,因为没有数组实例实际实现 equals() 方法。因此,当我们调用时,我们实际上是在调用该方法,该方法仅比较两个指针。Not equals<somearray>.equals(<otherarray>)Object.equals()

也就是说,请注意,您的代码实际上是在执行此操作:

boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

最终将调用将返回 。出于这个原因,也会回来。Arrays.equals(a, b)a0.equals(b0)falseArrays.equals(a, b)false

所以你的代码会打印出来,我们得出结论,Java平等有时可能很棘手。Different.