Java: Как проверить на равенство массивов? - PullRequest
44 голосов
/ 08 ноября 2011

Почему следующий код печати "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.");

Ответы [ 4 ]

72 голосов
/ 08 ноября 2011

Почему печатается следующий код "Different."?

Поскольку Arrays.equals выполняет поверхностное сравнение. Поскольку массивы наследуют их equals -метод от Object, будет выполнено сравнение идентификаторов для внутренних массивов, что не удастся, поскольку a и b не относятся к одинаковым массивам .

Если вы измените на Arrays.deepEquals, будет напечатано "Equal.", как и ожидалось.

15 голосов
/ 08 ноября 2011

Это на самом деле не очевидно.

Прежде всего, оператор == просто сравнивает два указателя.Поскольку a и b являются различными объектами, расположенными по разным адресам памяти, a == b вернет false (Привет, Java-пуристы, я знаю, что == фактически сравнивает идентификаторы объектов . Iя просто пытаюсь быть дидактическим).

Теперь давайте взглянем на 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 иногда может быть сложным.

6 голосов
/ 08 ноября 2011

Используйте Arrays.deepEquals () для многомерных массивов.

0 голосов
/ 09 июля 2012
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;
    }
...