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

Что произойдёт при вызове add на списке, полученном из Arrays.asList(array)?

MiddleПаттерны проектирования
Коротко

UnsupportedOperationException: Arrays.asList — адаптер над массивом фиксированного размера. add и remove не поддержаны, а set пишет прямо в массив (и изменения массива видны в списке).

  • Нужен изменяемый список — new ArrayList<>(Arrays.asList(arr))
  • List.of — полностью неизменяемый, set тоже бросает исключение
  • Arrays.asList(intArray) даёт List<int[]> из одного элемента

А ещё Формальное нарушение LSP — постусловие List.add ослаблено

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

Подробно

Arrays.asList возвращает не копию, а адаптер, пишущий прямо в исходный массив: set через список меняет массив, и наоборот. Размер при этом фиксирован, поэтому add и remove не поддержаны. Это одновременно хороший пример паттерна Adapter и формальное нарушение LSP — постусловие List.add ослаблено; живёт оно потому, что операция документирована как опциональная.

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

  • Исключение и причина.
  • Связь с массивом.
  • Как получить изменяемый список.

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

  • Считать результат обычным ArrayList.
  • Забывать, что список и массив связаны — изменения видны в обе стороны.

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

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

Показать варианты и ответ
  • ✓Бросится UnsupportedOperationException: это адаптер над массивом с фиксированным размером
  • ✗Элемент добавится, а массив автоматически расширится
  • ✗Элемент добавится в список, но не в исходный массив
  • ✗Бросится NullPointerException

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

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

Разбор темы

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

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

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

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

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