Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования