Java: Как проверить равенство массива?
Почему следующая печать кода "Different."
?
boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };
if (Arrays.equals(a, b) || a == b)
System.out.println("Equal.");
else
System.out.println("Different.");
Ответы
Ответ 1
Почему следующая печать кода "Different."
?
Потому что Arrays.equals
выполняет мелкое сравнение. Поскольку массивы наследуют свой метод equals
от Object
, для внутренних массивов будет выполняться сравнение идентичности, что не получится, поскольку a
и b
не относятся к тем же массивам.
Если вы перейдете на Arrays.deepEquals
, он напечатает "Equal."
, как ожидалось.
Ответ 2
Это действительно не очевидно.
Прежде всего, оператор ==
просто сравнивает два указателя. Поскольку a
и b
являются отдельными объектами, расположенными на разных адресах памяти, a == b
вернет false
(Эй, пуристы Java, я знаю, что ==
действительно сравнивает идентификаторы объектов. Я просто пытаюсь быть дидактическим).
Теперь рассмотрим реализацию equals()
массивов:
boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };
if (c.equals(d)) {
System.out.println("Equals");
} else {
System.out.println("Not equals");
}
Это напечатало бы Not equals
, потому что нет экземпляра массива на самом деле реализует метод equals()
. Поэтому, когда мы вызываем <somearray>.equals(<otherarray>)
, мы на самом деле вызываем метод Object.equals()
, который просто сравнивает два указателя.
Тем не менее, обратите внимание, что ваш код действительно делает это:
boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };
if (Arrays.equals(a, b) || a == b)
System.out.println("Equal.");
else
System.out.println("Different.");
Arrays.equals(a, b)
в конечном итоге вызовет a0.equals(b0)
, который вернет false
. По этой причине Arrays.equals(a, b)
также вернет false
.
Итак, ваш код напечатает Different.
, и мы сделаем вывод, что Java-равенство иногда может быть сложным.
Ответ 3
Используйте Arrays.deepEquals() для многомерных массивов.
Ответ 4
public static boolean equal(double[][] a, double[][] b) {
if (a == null) {
return (b == null);
}
if (b == null) {
return false; // already know 'a' isn't null
}
if (a.length != b.length) {
return false;
}
for (int i = 0; i < a.length; i++) {
if (!Arrays.equals(a[i], b[i])) {
return false;
}
}
return true;
}