Рубрики
Без рубрики

Arrays.deepEquals

В этом учебнике узнать все о том, как использовать метод Java Arrays deepEquals.

Автор оригинала: Alexandru Florin Hriscu.

1. Обзор

В этом учебнике мы погрузимся в детали deepEquals метод из Массивы класс . Мы увидим, когда мы должны использовать этот метод, и мы будем проходить через несколько простых примеров.

Чтобы узнать больше о различных методах в java.util.Arrays класса, проверить наши быстрое руководство .

2. Цель

Мы должны использовать deepEquals метод, когда мы хотим проверить равенство между двумя вложенными или многомерными массивами . Кроме того, когда мы хотим сравнить два массива, состоящие из определенных пользователем объектов, как мы увидим позже, мы должны переопределить равняется метод.

Теперь давайте узнаем более подробную информацию о deepEquals метод.

2.1. Синтаксис

Начнем с того, что посмотрим на метод подписи :

public static boolean deepEquals(Object[] a1, Object[] a2)

Из подписи метода мы замечаем, что мы не можем deepEquals для сравнения двух одномерных массивов примитивных типов данных . Для этого мы должны либо придать примитивный массив соответствующей обертке, либо использовать Arrays.equals метод, который перегрузит методы для примитивных массивов.

2.2. Осуществление

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

Поэтому мы должны избегать использования deepEquals метод с массивами, которые имеют самоссылки потому что это приведет к java.lang.StackOverflowError .

Далее давайте выясним, какой вывод мы можем получить от этого метода.

3. Выход

Arrays.deepEquals возвращает метод:

  • истинное если оба параметра являются одинаковым объектом (имеют одинаковую ссылку)
  • ложные если только один из двух параметров
  • недействительный ложные если массивы имеют разную длину
  • истинное если оба массива пусты
  • истинное если массивы содержат одинаковое количество элементов и каждая пара подразделов глубоко равны
  • ложные в других случаях

В следующем разделе мы посмотрим на некоторые примеры кода.

4. Примеры

Теперь пришло время, чтобы начать смотреть на deepEquals метод в действии. Более того, мы сравним deepEquals метод с равняется метод из того же Массивы класс.

4.1. Неимовеционные массивы

Во-первых, давайте начнем с простого примера и сравним два одномерных массива типов Объект :

    Object[] anArray = new Object[] { "string1", "string2", "string3" };
    Object[] anotherArray = new Object[] { "string1", "string2", "string3" };

    assertTrue(Arrays.equals(anArray, anotherArray));
    assertTrue(Arrays.deepEquals(anArray, anotherArray));

Мы видим, что и то, и другое равняется и deepEquals методы возврата истинное . Давайте выясним, что произойдет, если один из элементов наших массивов нулевой :

    Object[] anArray = new Object[] { "string1", null, "string3" };
    Object[] anotherArray = new Object[] { "string1", null, "string3" };

    assertTrue(Arrays.equals(anArray, anotherArray));
    assertTrue(Arrays.deepEquals(anArray, anotherArray));

Мы видим, что оба утверждения проходят. Таким образом, мы можем сделать вывод, что при использовании deepEquals метод, нулевой значения принимаются на любой глубине входных массивов .

Но давайте попробуем еще одну вещь, и давайте проверим поведение с вложенными массивами:

    Object[] anArray = new Object[] { "string1", null, new String[] {"nestedString1", "nestedString2" }};
    Object[] anotherArray = new Object[] { "string1", null, new String[] {"nestedString1", "nestedString2" } };

    assertFalse(Arrays.equals(anArray, anotherArray));
    assertTrue(Arrays.deepEquals(anArray, anotherArray));

Здесь мы узнаем, что deepEquals возвращает истинное в то равняется возвращает ложные . Это потому, deepEquals называет себя рекурсивно при столкновении с массивом , в то время как равные просто сравнивает ссылки под-arrays.

4.2. Многомерные массивы примитивных типов

Далее давайте проверим поведение с помощью многомерных массивов. В следующем примере эти два метода имеют разные результаты, подчеркивая тот факт, что мы должны использовать deepEquals вместо равняется метод при сравнении многомерных массивов:

    int[][] anArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };
    int[][] anotherArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };

    assertFalse(Arrays.equals(anArray, anotherArray));
    assertTrue(Arrays.deepEquals(anArray, anotherArray));

4.3. Многомерные массивы объектов, определяемых пользователем

Наконец, давайте проверим поведение deepEquals и равняется методы при тестировании равенства двух многомерных массивов для объекта, определяемого пользователем:

Начнем с создания простого Лицо класс:

    class Person {
        private int id;
        private String name;
        private int age;

        // constructor & getters & setters

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (!(obj instanceof Person))
                return false;
            Person person = (Person) obj;
            return id == person.id && name.equals(person.name) && age == person.age;
        }
    }

Необходимо переопределить равняется метод для нашего Лицо класс. В противном случае значение равняется метод будет сравнивать только ссылки объектов.

Кроме того, давайте принимать во внимание, что, даже если это не имеет отношения к нашему примеру, мы всегда должны переопределить хэш-код когда мы переопределяем равняется метод, чтобы мы не нарушали их контракты .

Далее мы можем сравнить два многомерных массива Лицо класс:

    Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) },
      { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
    Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, 
      { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
        
    assertFalse(Arrays.equals(personArray1, personArray2));
    assertTrue(Arrays.deepEquals(personArray1, personArray2));

В результате повторного сравнения подселений эти два метода снова имеют разные результаты.

Наконец, стоит отметить, что Objects.deepEquals метод выполняет Arrays.deepEquals метод внутренне когда он называется с двумя Объект Массивы:

    assertTrue(Objects.deepEquals(personArray1, personArray2));

5. Заключение

В этом быстром учебнике, мы узнали, что мы должны использовать Arrays.deepEquals метод, когда мы хотим сравнить равенство между двумя вложенными или многомерными массивами объектов или примитивными типами .

Как всегда, полный исходный код статьи доступен более на GitHub .