Java:如何测试数组相等?

use*_*686 45 java arrays equality

为什么以下代码打印"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.");
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 73

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

因为Arrays.equals执行比较.由于数组继承了它们的equals方法Object,因此将对内部数组执行身份比较,这将失败,因为a并且b不会引用相同的数组.

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

  • 不,最好将这些冗余放在一起.(无论如何,`Arrays.equals`的标准实现始于该检查.) (2认同)

fer*_*olo 15

这真的不明显.

首先,==操作员只需比较两个指针.因为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");
}
Run Code Online (Sandbox Code Playgroud)

这将打印,Not equals因为没有数组实例实际实现该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.");
Run Code Online (Sandbox Code Playgroud)

Arrays.equals(a, b)最终将调用a0.equals(b0)将返回false.因此,Arrays.equals(a, b)也将返回false.

因此,您的代码将打印出来Different.,我们得出结论,Java平等有时会很棘手.


小智 6

对多维数组使用Arrays.deepEquals().