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了Objectequals方法,因此将为内部数组执行标识比较,因为ab不会引用相同的数组,所以将会失败。

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

这真的不明显。

首先, ==运算符只是比较两个指针。 因为ab是位于不同内存地址的不同对象,所以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; }