Как сравнить два массива объектов в 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()
Работа
Обычно служебный класс java.util.Arrays очень полезен.
- Если два массива считаются равными, оба массива содержат одинаковое количество элементов, и все пары элементов в двух массивах равны, используйте Arrays.equals.
- Если две ссылки на массивы считаются глубоко равными, если обе равны нулю, или если они ссылаются на массивы, содержащие одинаковое количество элементов, и все соответствующие пары элементов в двух массивах являются глубоко равными, используйте Arrays.deepEquals. Этот метод подходит для использования с вложенными массивами произвольной глубины.