我已经运行了这个小程序:
String[] a = {"a","b"};
String[] b = {"a","b"};
if (a.equals(b)){
System.out.println("woop");
}else{
System.out.println("doh!");
}
if (Arrays.equals(a, b)){
System.out.println("woop");
}else{
System.out.println("doh!");
}
程序的输出是" doh! WOOP"
我得到了==和.equals之间的区别但是这些等于操作之间有什么区别?
答案 0 :(得分:3)
<强> TL; DR 强>
equals
比较数组实例,Arrays.equals
比较数组元素。
完整说明
数组不实现equals
。结果,他们将方法移交给Object
,其实现如下。
public boolean equals(Object obj) {
return (this == obj);
}
因此,数组上的equals
与==
相同。
Arrays.equals
具有以下描述。它比较了数组的元素。
如果两个指定的long数组彼此相等,则返回true。如果两个数组包含相同数量的元素,则两个数组被认为是相等的,并且两个数组中的所有相应元素对相等。换句话说,如果两个数组包含相同顺序的相同元素,则它们是相等的。此外,如果两个数组引用都为空,则认为它们相等。
答案 1 :(得分:2)
Arrays.equals(Object[] a, Object[] a2)
...
如果两个指定的Objects数组彼此相等,则返回true。如果两个数组包含相同数量的元素,则两个数组被认为是相等的,并且两个数组中的所有相应元素对是相等的。如果(e1 == null?e2 == null:e1.equals(e2)),则认为两个对象e1和e2相等。换句话说,如果两个数组包含相同顺序的相同元素,则它们是相等的。此外,如果两个数组引用都为空,则认为它们相等。
简而言之,您的所有String
都会通过equals
进行比较。
见API。
将两个数组与Object.equals
惯用语进行比较时调用的 array1.equals(array2)
比较引用,就像==
一样。
请参阅java.lang.Object
的来源:
public boolean equals (Object o) {
return this == o;
}
答案 2 :(得分:1)
区别在于a.equals(b)
将使用==在引擎盖下,因为数组不会覆盖Object.equals()
方法。您可以使用它来测试数组之间的实例相等性。
因此,在您的情况下,a.equals(b)
将返回false,因为这两个数组是不同的实例。
相反,Arrays.equals()
实际上比较了数组中内部的内容。如果数组包含相同的值,则Arrays.equals()
返回true。您可以使用它来测试数组之间的语义相等。
答案 3 :(得分:1)
对于数组,a.equals(b)
与a == b
相同。这是检查两个数组实例是否相同。 Arrays.equals(a,b)
花时间比较两个数组的每个元素,并检查元素是否相等,这与检查容器本身是否相等不同。
一个简单的类比:让我们说 a 和 b 是桶。询问两个桶是否相同不与询问桶中的内容是否相同是相同的。