Java:如何testing数组相等?
为什么下面的代码打印"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."
?
因为Arrays.equals
执行浅层比较。 由于数组inheritance了Object
的equals
方法,因此将为内部数组执行标识比较,因为a
和b
不会引用相同的数组,所以将会失败。
如果更改为Arrays.deepEquals
,它将打印"Equal."
如预期。
这真的不明显。
首先, ==
运算符只是比较两个指针。 因为a
和b
是位于不同内存地址的不同对象,所以a == b
将返回false
(嘿,Java纯粹主义者,我知道==
实际上是比较对象的身份 ,我只是试图说教)。
现在我们来看看数组的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"); }
这将打印Not equals
因为没有数组实例实际上实现了equals()
方法 。 所以,当我们调用<somearray>.equals(<otherarray>)
我们实际上调用了Object.equals()
方法, <somearray>.equals(<otherarray>)
比较两个指针。
这就是说,注意你的代码实际上是这样做的:
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
。
所以你的代码将打印Different.
我们得出的结论是,Java平等有时可能会非常棘手。
将Arrays.deepEquals()用于multidimensional array。
public static boolean equal(double[][] a, double[][] b) { if (a == null) { return (b == null); } if (b == null) { return false; // already know 'a' isn't null } if (a.length != b.length) { return false; } for (int i = 0; i < a.length; i++) { if (!Arrays.equals(a[i], b[i])) { return false; } } return true; }