Проверка равенства двух массивов в Java

Научитесь сравнивать два массива, используя различные методы в Java. Мы изучим сравнение массивов, начиная с простых циклов for и заканчивая встроенными API Java.

1. Как выполняется сравнение массивов?

В Java или любом другом языке программирования основы сравнения двух массивов одинаковы. Два массива равны, если:

  • оба являются либо нулевыми, либо ненулевыми.
  • оба они одного типа.
  • в обоих случаях количество предметов одинаковое.
  • оба имеют один и тот же элемент в соответствующих индексах в одном и том же порядке.
  • оба массива многомерные, то внутренние массивы также должны быть равны.

Теперь, когда мы знаем, что делает два массива равными, легко написать функцию, которая это проверит.

2. Проверка равенства массивов с помощью java.util.Arrays

2.1 Методы API

Для любой проблемы, если у вас есть API Java, доступный в JDK, всегда предпочитайте использовать его, а не писать его самостоятельно. Вам следует писать новую функцию только тогда, когда у вас есть очень веская причина сделать это, в противном случае используйте встроенные API.

Класс Arrays предоставляет множество полезных методов для работы с массивами. Для проверки равенства массивов он предоставляет два метода, которые имеют несколько перегруженных форм для принятия различных типов массивов:

  • public static boolean equals(array1, array2) : возвращает true, если array1 и array2 равны друг другу, т.е. они содержат одни и те же элементы в одном и том же порядке.
  • public static boolean equals(array1, array2, comparator) : возвращает true, если array1 и array2 равны друг другу. Два элемента массива e1 и e2 считаются равными, если comparator.compare(e1, e2) == 0.
  • public static boolean deepEquals(array1, array2) : возвращает true, если array1 и array2 глубоко равны друг другу. Этот метод подходит для использования с вложенными массивами произвольной глубины.

2.2 Простые массивы

Простые массивы — это одномерные массивы, которые не являются вложенными. В простых массивах у нас может быть любой тип элемента, и необходимо понимать, как с ними работать.

  • Массивы примитивов и строк: примитивы и строки всегда сравниваются по их значению, поэтому мы можем безопасно использовать API equals().
  • Типы объектов: В этом случае нам нужно знать, как два элемента массива будут проверяться на равенство. Если необходимо использовать равенство объектов по умолчанию или класс переопределил метод 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); //truematches = Arrays.equals(a1, a3); //false

2.3 Вложенные массивы

Чтобы проверить равенство вложенного массива, мы должны использовать API deepEquals().

Важно отметить, что deepEquals() работает только с типами объектов, поэтому 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

По какой-то причине, если мы не можем использовать класс Arrays, мы можем написать свой собственный метод и добавить туда пользовательскую логику.

Например, мы не объявляем массивы равными, если оба массива равны нулю. В этом случае мы можем написать собственную функцию, в которой мы перебираем массив элементов в цикле 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

Чтобы сделать код более читаемым, мы можем использовать IntStream.range() API потока вместо цикла for. В остальном оставшаяся логика такая же, как в предыдущем примере.

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.

Наконец, мы научились использовать API Java и простой цикл for для настройки логики равенства массивов.

Исходный код на Github

Прокрутить вверх