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."按预期打印.
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平等有时会很棘手.