Получить доступ

Что произойдёт, если объявить record с полем-массивом и сравнить два таких объекта с одинаковым содержимым массива?

MiddleСовременная JavaJava >=16
Коротко

equals вернёт false: сгенерированный equals сравнивает компоненты их собственным equals, а у массива это сравнение по ссылке. hashCode тоже будет по идентичности, toString напечатает адрес.

  • Решение: хранить List (List.copyOf) вместо массива
  • Или переопределить equals, hashCode, toString через Arrays.equals, Arrays.hashCode
  • Массив ещё и изменяем — нужна копия

А ещё IDE и анализаторы предупреждают о массиве в record

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Это неочевидная ловушка: record выглядит так, будто «всё сделает правильно», но для ссылочных компонентов он вызывает их собственный equals, а у массива это сравнение по идентичности. Заодно и hashCode окажется бесполезным, и toString напечатает адрес вместо содержимого. Правильные решения: хранить неизменяемый List вместо массива — тогда всё работает ожидаемо — либо вручную переопределить equals, hashCode и toString с использованием Arrays. Тот же принцип касается любого компонента с неудачным equals.

Что хотят услышать

  • Результат и причина.
  • Решения.

Частые ошибки

  • Считать, что record корректно сравнит любые компоненты.
  • Хранить в record изменяемый массив и полагаться на неизменяемость.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓equals вернёт false: сгенерированная реализация сравнивает массивы по ссылке, а не по содержимому
  • ✗equals вернёт true: компилятор использует Arrays.equals для массивов
  • ✗Компилятор запретит объявлять массив компонентом record
  • ✗Будет брошено исключение при сравнении

Что спросят дальше

  • Почему List предпочтительнее массива в качестве компонента?
  • Как сделать компонент-коллекцию по-настоящему неизменяемым?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем