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

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

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

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

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

if(array1 == array2) 

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

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

6 ответов


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

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

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

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

  • e1 и e2 являются массивами ссылочных типов объектов и массивами.deepEquals (e1, e2) вернет true
  • E1 и e2 являются массивами одного и того же примитивного типа и соответствующей перегрузкой массивов.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) 

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

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

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


вообще служебный класс java.утиль.Массивы - это очень полезно.

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

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