章
目
录
学习在Java中使用不同技巧比较两个数组。我们将学习从使用简单的for循环到使用内置的Java API进行比较数组是否相等。
1.如何进行数组比较?
在Java或任何其他编程语言中,比较两个数组的基本原理都是相同的。两个数组相等的条件是:
- 它们都可以是null或非null。
- 它们都是相同类型的。
- 它们都有相等数量的项。
- 它们在相应索引处具有相同顺序的相同项。
- 如果两个数组都是多维的,那么内部数组也需要相等。
现在我们知道了什么会使两个数组相等,编写一个检查它们是否相等的函数就很容易了。
2.使用java.util.Arrays检查数组相等性
2.1. API方法
对于任何问题,如果在JDK中有可用的Java API,总是首选使用它而不是自己编写。只有在有非常强烈的理由时才应编写新函数,否则使用内置的API。
Arrays类提供了许多用于操作数组的有用方法。为了检查数组是否相等,它提供了两个方法,具有多个重载形式以接受不同的数组类型:
- public static boolean equals(array1, array2):如果array1和array2相等,即它们包含相同顺序的相同元素,则返回true。
- public static boolean equals(array1, array2, comparator):如果array1和array2相等,则返回true。如果comparator.compare(e1, e2) == 0,则认为两个数组项e1和e2相等。
- public static boolean deepEquals(array1, array2):如果array1和array2彼此深度相等,则返回true。此方法适用于任意深度的嵌套数组。
2.2. 简单数组
简单数组是不嵌套的1-D数组。在简单数组中,我们可以包含任何类型的项,因此有必要了解如何处理它们。
- 基本类型和字符串数组:基本类型和字符串始终按其值进行比较,因此我们可以安全地使用equals() API。
- 对象类型:在这种情况下,我们需要知道如何检查两个数组项是否相等。如果要使用默认对象相等性,或者类已经重写了Object.equals()方法,那么我们可以使用Arrays.equals(),否则我们必须使用带有自定义对象相等性逻辑的API的Comparator版本。
String[] a1 = {"A", "B", "C"};
String[] a2 = {"A", "B", "C"};
String[] a3 = {"X", "Y", "Z"};
boolean matches = Arrays.equals(a1, a2); //true
matches = Arrays.equals(a1, a3); //false
2.3. 二维数组
要检查二维数组的相等性,我们必须使用deepEquals() API。
需要注意的是,deepEquals() 只适用于对象类型,因此不能用于基本类型数组,但我们可以用它来比较任何简单或嵌套数组。
String[][] a4 =
{
{"A", "B", "C"},
{"X", "Y", "Z"}
};
String[][] a5 =
{
{"A", "B", "C"},
{"X", "Y", "Z"}
};
boolean matches = Arrays.deepEquals(a4, a5); //true
3.使用 ‘For-Loop’ 进行数组比较
如果由于某种原因我们无法使用Arrays类,我们可以编写自己的方法并在其中添加自定义逻辑。
例如,如果我们不希望在两个数组都为null时声明它们相等,那么我们可以编写自己的函数,在其中使用for循环遍历数组项并逐一比较这些项。也可能会有其他更有说服力的原因。
在以下的checkArrayEqualityWithForLoop()方法中,我们正在编写用于检查两个简单数组相等性的代码。您可以随意修改逻辑以满足您的需求。
public static boolean checkArrayEqualityWithForLoop(String[] a1,
String[] a2) {
if (a1 == a2) {
return true;
}
if (a1 == null || a2 == null) {
return false;
}
int n = a1.length;
if (n != a2.length) {
return false;
}
for (int i = 0; i < n; i++) {
if (!a1[i].equals(a2[i])) {
return false;
}
}
return true;
}
4.使用Stream API进行数组比较
为了使代码更易读,我们可以在for循环的位置使用Stream API的IntStream.range()。其余的逻辑与之前的示例相同。
public static boolean checkEqualityWithStream(String[] a1, String[] a2) {
if (a1 == a2) {
return true;
}
if (a1 == null || a2 == null || a1.length != a2.length) {
return false;
}
return IntStream.range(0, a1.length).allMatch(i -> a1[i].equals(a2[i]));
}
5.结论
在本教程中,我们学习了如何在Java中检查两个数组是否相等。我们了解了检查简单数组和二维数组相等性的规则。此外,我们学习了如何使用Object.equals()和Comparator来处理数组项的相等性。
最后,我们学习了如何使用Java API以及如何使用简单的for循环来自定义数组相等性逻辑。