Как создать ArrayList из массива в Java? Лучшие способы и подводные камни
Правильный способ: new ArrayList<>(Arrays.asList(array))
Вы столкнулись с классической ловушкой Java. Метод Arrays.asList() возвращает не обычный java.util.ArrayList, а свою внутреннюю реализацию списка фиксированного размера. Она не поддерживает операции add() и remove() — отсюда и исключение.
Вот полное, рабочее решение для создания изменяемого ArrayList из массива:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToArrayListExample {
public static void main(String[] args) {
// Исходный массив
String[] array = {"apple", "banana", "cherry"};
// ✅ Правильный способ: оборачиваем Arrays.asList() в новый ArrayList
ArrayList<String> list = new ArrayList<>(Arrays.asList(array));
// Теперь можно добавлять и удалять элементы
list.add("orange");
list.remove("banana");
System.out.println(list); // [apple, cherry, orange]
}
}
Почему это работает?
Конструктор ArrayList(Collection<? extends E> c) принимает любую коллекцию и копирует все её элементы в новый, полноценный ArrayList. Arrays.asList() создаёт список-обёртку над массивом, а конструктор ArrayList делает из него независимую копию.
Альтернативные способы (тоже рабочие)
1. Использование Stream API (Java 8+)
ArrayList<String> list = Arrays.stream(array)
.collect(Collectors.toCollection(ArrayList::new));
2. Ручное копирование через цикл
ArrayList<String> list = new ArrayList<>();
for (String item : array) {
list.add(item);
}
3. Collections.addAll() (самый быстрый)
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, array);
Что нельзя делать (распространённые ошибки)
ArrayList<String> list = new ArrayList<>(array);— ошибка компиляции. Массив — не коллекция.List<String> list = Arrays.asList(array);— список фиксированного размера, нельзя менять размер.list = Arrays.asList("a", "b", "c"); list.add("d");— то же самое, UnsupportedOperationException.
Для примитивных типов (int[], double[] и т.д.)
С примитивными массивами сложнее — Arrays.asList() не работает напрямую. Нужен отдельный подход:
int[] intArray = {1, 2, 3};
ArrayList<Integer> list = new ArrayList<>();
for (int value : intArray) {
list.add(value);
}
// Или через IntStream:
ArrayList<Integer> list = Arrays.stream(intArray)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
Итоговая рекомендация
Для 90% случаев используйте new ArrayList<>(Arrays.asList(array)) — это самый читаемый и надёжный способ. Если массив большой и важна производительность — используйте Collections.addAll(). Для примитивных массивов — цикл или Stream с boxed().
Альтернативный подход: использование Guava или Apache Commons
Если вы работаете над проектом, где уже используются библиотеки Google Guava или Apache Commons Lang, они предоставляют удобные утилиты для работы с коллекциями.
С помощью Guava:
import com.google.common.collect.Lists;
String[] array = {"apple", "banana", "cherry"};
ArrayList<String> list = Lists.newArrayList(array);
Lists.newArrayList() принимает массив и сразу возвращает изменяемый ArrayList. Код очень лаконичный.
С помощью Apache Commons Lang:
import org.apache.commons.lang3.ArrayUtils;
String[] array = {"apple", "banana", "cherry"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(ArrayUtils.toObject(array)));
Для примитивных массивов ArrayUtils.toObject() преобразует int[] в Integer[], после чего можно использовать стандартный Arrays.asList().
Когда это удобно? Если вы уже используете эти библиотеки в проекте — нет смысла писать велосипед. Но для учебных целей или простых проектов лучше обойтись стандартной библиотекой Java, чтобы не добавлять лишних зависимостей.