Это на самом деле не очевидно.
Прежде всего, оператор ==
просто сравнивает два указателя.Поскольку 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 иногда может быть сложным.