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

Что верно про неизменяемые и защитные коллекции?

MiddleКоллекцииJava >=10
Ещё спрашивают так:
  • Чем List.of отличается от Collections.unmodifiableList?
Коротко

List.of и List.copyOf — настоящие неизменяемые коллекции, null запрещён. Collections.unmodifiableList — представление: через исходную ссылку список по-прежнему меняется. Объекты внутри в обоих случаях остаются изменяемыми.

  • List.copyOf (Java 10) — защитная копия, не копирует, если уже неизменяемый
  • Изменение неизменяемой коллекции — UnsupportedOperationException
  • Stream.toList() (Java 16) тоже неизменяемый

А ещё Для защиты поля — copyOf в конструкторе и геттере

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

Подробно

Разница между обёрткой и копией практически важна: unmodifiableList запрещает изменения только через себя, а через исходную ссылку список по-прежнему меняется — как средство защиты это ненадёжно, если оригинал кому-то доступен. List.of и List.copyOf создают действительно независимые неизменяемые коллекции; copyOf при этом не копирует повторно, если на вход уже пришла неизменяемая коллекция. И главное ограничение обоих подходов: неизменяем сам контейнер, а не объекты в нём — изменяемый объект внутри неизменяемого списка спокойно меняется.

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

  • Копия против представления.
  • Запрет null и поведение при изменении.
  • Неизменяемость не распространяется на элементы.

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

  • Считать unmodifiableList надёжной защитой при доступной исходной ссылке.
  • Класть null в List.of по привычке от Arrays.asList.

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

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓List.of(...) не допускает null-элементов и бросает NullPointerException
  • ✓Collections.unmodifiableList возвращает представление: изменения исходного списка видны через него
  • ✓Неизменяемость коллекции не делает неизменяемыми хранящиеся в ней объекты
  • ✗List.copyOf возвращает представление исходного списка

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

  • Что такое защитное копирование в конструкторе?
  • Чем List.of отличается от Arrays.asList?

Разбор темы

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

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

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

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

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