Java:如何测试数组相等性?
为什么打印以下代码?"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.");
为什么打印以下代码?"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.");
为什么以下代码打印
“不同”
?
因为 Arrays.equals
执行浅层比较。由于数组继承了它们的 -method ,因此将为内部数组执行标识比较,这将失败,因为 并且不引用相同的数组。equals
Object
a
b
如果更改为 Arrays.deepEquals,
它将按预期方式打印。"Equal."
这真的不明显。
首先,操作员只需比较两个指针。因为和是位于不同内存地址的不同对象,会返回(嘿,Java纯粹主义者,我知道实际上比较对象身份。我只是想说教)。==
a
b
a == b
false
==
现在让我们看一下数组的实现: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)
false
Arrays.equals(a, b)
false
所以你的代码会打印出来,我们得出结论,Java平等有时可能很棘手。Different.