Рубрики

Как сравнить два массива в Java?

Предсказать вывод следующей программы Java.

class Test

{

    public static void main (String[] args) 

    {

        int arr1[] = {1, 2, 3};

        int arr2[] = {1, 2, 3};

        if (arr1 == arr2) // То же, что и arr1.equals (arr2)

            System.out.println("Same");

        else

            System.out.println("Not same");

    }

}

Выход:

Not Same

В Java массивы являются объектами первого класса . В приведенной выше программе arr1 и arr2 являются двумя ссылками на два разных объекта. Поэтому, когда мы сравниваем arr1 и arr2, сравниваются две ссылочные переменные, поэтому мы получаем вывод «Not Same» (см. Это для большего количества примеров).

Как сравнить содержимое массива?
Простой способ — запустить цикл и сравнить элементы один за другим. Java предоставляет прямой метод Arrays.equals () для сравнения двух массивов. На самом деле, существует список методов equals () в классе Arrays для различных примитивных типов (int, char, ..etc) и один для типа Object (который является основой всех классов в Java).

// нам нужно импортировать java.util.Arrays, чтобы использовать Arrays.equals ().

import java.util.Arrays;

class Test

{

    public static void main (String[] args) 

    {

        int arr1[] = {1, 2, 3};

        int arr2[] = {1, 2, 3};

        if (Arrays.equals(arr1, arr2))

            System.out.println("Same");

        else

            System.out.println("Not same");

    }

}

Выход:

Same

Как глубоко сравнить содержимое массива?
Как видно выше, Arrays.equals () работает нормально и сравнивает содержимое массивов. Теперь вопросы, а что, если массивы содержат массивы внутри них или некоторые другие ссылки, которые ссылаются на другой объект, но имеют одинаковые значения. Например, см. Следующую программу.

import java.util.Arrays;

class Test

{

    public static void main (String[] args) 

    {

        // inarr1 и inarr2 имеют одинаковые значения

        int inarr1[] = {1, 2, 3};

        int inarr2[] = {1, 2, 3};   

        Object[] arr1 = {inarr1};  // arr1 содержит только один элемент

        Object[] arr2 = {inarr2};  // arr2 также содержит только один элемент

        if (Arrays.equals(arr1, arr2))

            System.out.println("Same");

        else

            System.out.println("Not same");

    }

}

Выход:

Not Same

Поэтому Arrays.equals () не может делать глубокое сравнение. Java предоставляет другой метод для этого Arrays.deepEquals (), который выполняет глубокое сравнение.

import java.util.Arrays;

class Test

{

    public static void main (String[] args) 

    {

        int inarr1[] = {1, 2, 3};

        int inarr2[] = {1, 2, 3}; 

        Object[] arr1 = {inarr1};  // arr1 содержит только один элемент

        Object[] arr2 = {inarr2};  // arr2 также содержит только один элемент

        if (Arrays.deepEquals(arr1, arr2))

            System.out.println("Same");

        else

            System.out.println("Not same");

    }

}

Выход:

Same

Как работает Arrays.deepEquals ()?
Он сравнивает два объекта с использованием любых пользовательских методов equals (), которые они могут иметь (если у них реализован метод equals (), отличный от Object.equals ()). Если нет, то этот метод будет затем рекурсивно сравнивать объекты поле за полем. При обнаружении каждого поля оно будет пытаться использовать производное equals (), если оно существует, в противном случае оно продолжит повторение.
Этот метод работает с циклическим графом объектов следующим образом: A-> B-> C-> A. У него есть обнаружение цикла, поэтому можно сравнивать ЛЮБЫЕ два объекта, и он никогда не войдет в бесконечный цикл (Источник: https://code.google.com/p/deep-equals/ ).

Упражнение: предсказать результат следующей программы

import java.util.Arrays;

class Test

{

   public static void main (String[] args) 

   {

      int inarr1[] = {1, 2, 3};

      int inarr2[] = {1, 2, 3}; 

      Object[] arr1 = {inarr1};  // arr1 содержит только один элемент

      Object[] arr2 = {inarr2};  // arr2 также содержит только один элемент

      Object[] outarr1 = {arr1}; // outarr1 содержит только один элемент

      Object[] outarr2 = {arr2}; // outarr2 также содержит только один элемент

      if (Arrays.deepEquals(outarr1, outarr2))

          System.out.println("Same");

      else

          System.out.println("Not same");

    }

}

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Как сравнить два массива в Java?

0.00 (0%) 0 votes