Что произойдёт при вызове add на списке, полученном из Arrays.asList(array)?
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?
Разбор темы
- Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.