为什么以下代码打印"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.");
答案 0 :(得分:71)
为什么以下代码打印
"Different."
?
因为Arrays.equals
执行浅比较。由于数组从equals
继承了Object
- 方法,因此将对内部数组执行身份比较,这将失败,因为a
和b
没有引用相同的数组。
如果您更改为Arrays.deepEquals
,则会按预期打印"Equal."
。
答案 1 :(得分: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");
}
那会打印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.");
Arrays.equals(a, b)
最终会调用a0.equals(b0)
,false
将返回Arrays.equals(a, b)
。因此,false
也会返回Different.
。
因此,您的代码将打印{{1}},并且我们得出结论,Java等式有时会很棘手。
答案 2 :(得分:6)
对多维数组使用Arrays.deepEquals()。
答案 3 :(得分:0)
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;
}