Дан Java-код: List l = Arrays.asList("a","b"); l.add("c"); — почему этот код выбрасывает исключение и какие способы изменить список существуют

5 Дек в 10:58
4 +1
0
Ответы
1
Потому что `Arrays.asList(...)` возвращает фиксированного размера список, который является представлением (view) массива и не поддерживает операции изменения размера. При вызове `l.add("c")` бросается `UnsupportedOperationException`.
Короткие пояснения:
- `Arrays.asList("a","b")` возвращает реализацию `java.util.Arrays$ArrayList`, она backed by массив и её размер равен 222. Операции `add`/`remove` не поддерживаются, а `set` — поддерживается (заменяет элемент).
- Исключение: `UnsupportedOperationException`.
Способы изменить/получить изменяемый список:
1. Создать изменяемую копию:
- `List l = new ArrayList(Arrays.asList("a","b")); l.add("c");`
2. Использовать `Collections.addAll` в новую коллекцию:
- `List l = new ArrayList(); Collections.addAll(l, "a","b"); l.add("c");`
3. Через потоки:
- `List l = Stream.of("a","b").collect(Collectors.toCollection(ArrayList::new));`
4. Использовать другую реализацию списка сразу:
- `List l = new LinkedList(Arrays.asList("a","b"));`
5. Если нужно только заменить элементы (не менять размер): использовать `set`, например `l.set(0, "x")` — это работает для списка от `Arrays.asList`.
6. В Java 9+ можно получать неизменяемые списки через `List.of(...)` — они тоже не поддерживают `add` (только для информации). Чтобы получить изменяемый: `new ArrayList(List.of("a","b"))`.
Вывод: для добавления элементов нужно использовать изменяемую реализацию (например `ArrayList`) или создать её копию из результата `Arrays.asList`.
5 Дек в 11:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир