章
目
录
1.概述
在本教程中,我们将结合示例讲解在Java中比较数组是否相等的不同方法。
2.比较数组是否相等的不同方法
2.1 使用Array.equals比较数组
为了检查两个数组在内容上是否相等,Java提供了Arrays.equals静态方法。此方法将并行遍历数组中的每个位置,并对每对元素应用==运算符。
让我们用完全相同的顺序创建两个具有相同字符串文字的不同数组:
String[] planes1 = new String[] { "A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332" };
String[] planes2 = new String[] { "A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332" };
现在,让我们断言它们是相等的:
assertThat(Arrays.equals(planes1, planes2)).isTrue();
如果我们改变第二个数组值的顺序:
String[] planes1 = new String[] { "A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332" };
String[] planes2 = new String[] { "B738", "A320", "A321", "A319", "B77W", "B737", "A333", "A332" };
我们将得到不同的结果,发现两个数组不再相等:
assertThat(Arrays.equals(planes1, planes2)).isFalse();
2.2 使用 Arrays.deepEquals 比较数组
如果我们在Java中使用简单类型,那么使用==运算符很容易。这些类型可以是基本类型或字符串文字。对象数组之间的比较可能更复杂。在我们的Arrays.deepEquals文章中完整解释了背后的原因。让我们看一个例子。
首先,让我们从一个Plane类开始:
public class Plane {
private final String name;
private final String model;
// getters 和 setters
}
然后,让我们实现 hashCode 和 equals 方法:
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Plane plane = (Plane) o;
return Objects.equals(name, plane.name) && Objects.equals(model, plane.model);
}
@Override
public int hashCode() {
return Objects.hash(name, model);
}
其次,让我们创建以下两个元素数组:
Plane[][] planes1
= new Plane[][] { new Plane[]{new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738") }};
Plane[][] planes2
= new Plane[][] { new Plane[]{new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738") }};
现在让我们看看它们是否是真正完全相同的数组,发现是相同的数组:
assertThat(Arrays.deepEquals(planes1, planes2)).isTrue();
为了确保我们的比较工作如预期进行,让我们现在更改最后一个数组的顺序:
Plane[][] planes1
= new Plane[][] { new Plane[]{new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738") }};
Plane[][] planes2
= new Plane[][] { new Plane[]{new Plane("Plane 2", "B738")}, new Plane[]{new Plane("Plane 1", "A320") }};
最后,让我们测试它们是否确实不再相等:
assertThat(Arrays.deepEquals(planes1, planes2)).isFalse();
2.3 按字典顺序比较数组
Java 9 在 Arrays 工具类中引入了一个全新的方法,称为 compare()。顾名思义,此方法允许我们按字典顺序比较两个数组。
简而言之,按字典顺序进行比较是逐个元素进行的,并且是指元素的自然顺序,例如数字的数值顺序或字符串的字母顺序。
通常情况下,如果两个数组具有相同的长度,则比较是分别在各自数组中相同索引处的每对元素之间的比较的结果。
因此,让我们看一下它的作用:
@Test
void givenSameContents_whenCompare_thenCorrect() {
String[] array1 = new String[] { "A", "B", "C" };
String[] array2 = new String[] { "A", "B", "C" };
assertThat(Arrays.compare(array1, array2)).isEqualTo(0);
}
如上所示,当给定的两个数组在字典顺序上相等时,compare()返回0。
另一方面,如果两个数组具有不同的长度,则该方法比较两个数组的长度并返回结果:
@Test
void givenDifferentContents_whenCompare_thenDifferent() {
String[] array1 = new String[] { "A", "B", "C" };
String[] array2 = new String[] { "A", "C", "B", "D" };
assertThat(Arrays.compare(array1, array2)).isLessThan(0);
assertThat(Arrays.compare(array2, array1)).isGreaterThan(0);
assertThat(Arrays.compare(array1, null)).isGreaterThan(0);
}
正如我们所看到的,当第一个给定的数组在字典顺序上大于第二个时,该方法返回大于零的值。否则,它返回小于零的值。
此外,一个null总是比一个非null数组在字典顺序上小。
请注意,Arrays类提供了几个重载的compare()版本,用于比较包含boolean值、byte、char和整型等原始数据的数组。
3.结论
在本教程中,我们看到了比较数组的不同方法。其次,我们看到了比较引用和值之间的区别。此外,我们研究了如何深入比较数组。最后,我们分别看到了使用 equals 和 deepEquals 进行普通比较和深度比较之间的区别。