Подтвердить что ты не робот

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.");
4b9b3361

Ответ 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;
    }