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