Почему equals у массивов в Java не сравнивает содержимое?

В Java массив выглядит как контейнер значений, поэтому легко ожидать, что equals сравнит элементы внутри.

Но массивы не переопределяют equals для содержимого. Обычный equals у массива работает почти как сравнение ссылок.

Например, два массива с одинаковыми числами не будут равны через equals:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};

System.out.println(a.equals(b));


Результат будет false, потому что это два разных объекта в памяти.

Для одномерных массивов нужно использовать Arrays.equals:
System.out.println(Arrays.equals(a, b));


Теперь Java сравнит элементы по порядку и вернёт true.

С массивами объектов логика такая же:
String[] left = {"java", "ready"};
String[] right = {"java", "ready"};

System.out.println(Arrays.equals(left, right));


Но для вложенных массивов Arrays.equals уже недостаточно. Он сравнит внутренние массивы как объекты.

Для двумерных структур нужен deepEquals:
int[][] x = {{1, 2}, {3, 4}};
int[][] y = {{1, 2}, {3, 4}};

System.out.println(Arrays.deepEquals(x, y));


То же самое касается вывода. Обычный toString у массива покажет служебное имя, а не элементы.

Для нормального вывода используют Arrays.toString:
System.out.println(Arrays.toString(a));


Если массив вложенный, нужен deepToString:
System.out.println(Arrays.deepToString(x));


Массивы в Java стоит сравнивать и выводить через Arrays. Иначе код может выглядеть логично, но проверять совсем не то.

Java Библиотека | Мы в Телеграм
Просмотры: 188
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти