Как сравнить два массива объектов в Java?

У меня есть два массива объектов, например, так:

Object[] array1 = {0, 1, 2, 3};
Object[] array2 = {0, 1, 2, 3};

Я хотел бы знать, равны ли массивы. Я определяю равным, поскольку каждое значение в массиве1 совпадает со значением в этой позиции в массиве2. Таким образом, эти два массива были бы равны.

Что лучше, чтобы узнать, равны ли эти два массива?

if(array1 == array2) 

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

Редактировать: мне нужно равные, которые могут входить во вложенные массивы.

6 ответов

Решение

Использование Arrays.deepEquals(), Это делает ту же работу, что и Arrays.equals() но также работает с вложенными массивами.

Возвращает true, если два указанных массива глубоко равны друг другу. в отличие от equals(Object[],Object[]) Метод, этот метод подходит для использования с вложенными массивами произвольной глубины.

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

Два возможно нулевых элемента e1 и e2 глубоко равны, если выполняется любое из следующих условий:

  • e1 и e2 оба являются массивами ссылочных типов объектов, и Arrays.deepEquals(e1, e2) вернет true
  • e1 и e2 являются массивами одного и того же примитивного типа, и соответствующая перегрузка Arrays.equals(e1, e2) вернула бы true.
  • e1 == e2
  • e1.equals (e2) вернет true.

Обратите внимание, что это определение допускает нулевые элементы на любой глубине.

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

java.util.Arrays.equals

   /**
     * Returns <tt>true</tt> if the two specified arrays of Objects are
     * <i>equal</i> to one another.  The two arrays are considered equal if
     * both arrays contain the same number of elements, and all corresponding
     * pairs of elements in the two arrays are equal.  Two objects <tt>e1</tt>
     * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
     * : e1.equals(e2))</tt>.  In other words, the two arrays are equal if
     * they contain the same elements in the same order.  Also, two array
     * references are considered equal if both are <tt>null</tt>.<p>
     *
     * @param a one array to be tested for equality.
     * @param a2 the other array to be tested for equality.
     * @return <tt>true</tt> if the two arrays are equal.
     */
    public static boolean equals(Object[] a, Object[] a2) 

Для сравнения массивов я бы использовал метод Arrays.equals:

if (Arrays.equals(array1, array2))
{    
  // array1 and array2 contain the same elements in the same order
}

В приведенном вами примере массивы будут содержать Integer объекты. В таком случае, Arrays.equals() достаточно. Однако, если ваши массивы содержат некоторые ваши объекты, вы должны реализовать equals() в вашем классе, чтобы Arrays.equals() Работа

array1.equals(array2) должен дать вам то, что вы ищете.

Обычно служебный класс java.util.Arrays очень полезен.

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