这并不是显而易见的。
首先,==
运算符只比较两个指针。因为 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.
,我们可以得出结论:Java 中的相等性有时可能比较棘手。
a == b
或者不测试。如果equals
为真,第二个表达式应该总是为真。 - Peter Lawrey