Java中比较两个数组是否相等

培训教学 潘老师 7个月前 (09-21) 154 ℃ (0) 扫码查看

学习在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循环来自定义数组相等性逻辑。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9174.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】