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

Что произойдёт при вызове 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 ослаблено

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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