Инициализация ArrayList в одну строку в Java: как создать и заполнить список сразу
Правильный способ инициализации ArrayList в одну строку
Проблема, с которой вы столкнулись, очень распространена среди новичков. В Java нет синтаксического сахара для инициализации коллекций в одну строку, как в Python или JavaScript, но есть несколько элегантных решений. Самое популярное и правильное — использование двойной инициализации (double brace initialization) или, что лучше, фабричных методов из Java 9+.
Способ 1: Arrays.asList() + конструктор ArrayList (Java 5+)
Этот способ работает во всех версиях Java, начиная с 5-й. Arrays.asList() возвращает список фиксированного размера, но если обернуть его в конструктор ArrayList, вы получите полноценный изменяемый список:
import java.util.ArrayList;
import java.util.Arrays;
ArrayList<String> list = new ArrayList<>(Arrays.asList("один", "два", "три"));
list.add("четыре"); // Работает!
list.remove("один"); // Работает!
Это самый надёжный вариант для старых версий Java. Он создаёт новый ArrayList, который копирует элементы из фиксированного списка.
Способ 2: List.of() (Java 9+)
Начиная с Java 9, появился фабричный метод List.of(), который создаёт неизменяемый список. Чтобы получить изменяемый ArrayList, используйте его с конструктором:
ArrayList<String> list = new ArrayList<>(List.of("один", "два", "три"));
list.add("четыре"); // Работает!
Важно: List.of() не принимает null элементы и возвращает иммутабельный список. Если вам нужно изменять список — всегда оборачивайте в new ArrayList<>(...).
Способ 3: Stream API (Java 8+)
Можно использовать Stream, хотя это избыточно для простой инициализации:
ArrayList<String> list = Stream.of("один", "два", "три")
.collect(Collectors.toCollection(ArrayList::new));
Этот способ полезен, если вам нужно дополнительно обработать элементы перед добавлением (например, отфильтровать или преобразовать).
Почему не работает Arrays.asList() напрямую?
Метод Arrays.asList() возвращает представление (view) исходного массива в виде списка, но это не ArrayList, а внутренний класс Arrays.ArrayList, который имеет фиксированный размер. Поэтому при попытке добавить или удалить элемент вы получаете UnsupportedOperationException. Запомните правило: Arrays.asList() — только для чтения, если не обернуть в настоящий ArrayList.
Что выбрать?
- Если проект на Java 8 и ниже — используйте
new ArrayList<>(Arrays.asList(...)). - Если проект на Java 9+ — используйте
new ArrayList<>(List.of(...))— это современнее и производительнее. - Избегайте "double brace initialization" (
new ArrayList<>() {{ add("a"); add("b"); }}) — это создаёт анонимный класс, что может привести к утечкам памяти и проблемам с сериализацией.
Также обратите внимание, что в Java 10+ можно использовать var для краткости:
var list = new ArrayList<>(List.of("один", "два", "три"));
Итог
Инициализация в одну строку — это просто обёртка фабричного метода в конструктор. Выберите подходящий для вашей версии Java и работайте с коллекцией как обычно.
<<Альтернативный подход: использование сторонних библиотек
Если вы работаете с проектом, где уже используется библиотека Guava от Google, или вы готовы её подключить, то инициализация становится ещё проще:
import com.google.common.collect.Lists;
ArrayList<String> list = Lists.newArrayList("один", "два", "три");
list.add("четыре"); // Работает!
Метод Lists.newArrayList() принимает varargs (переменное количество аргументов) и сразу возвращает полноценный изменяемый ArrayList. Это удобно, если вы часто создаёте списки с небольшим количеством элементов.
Для immutable списков (Java 9+)
Если вам не нужно изменять список после создания, используйте List.of() напрямую (без обёртки в ArrayList):
List<String> list = List.of("один", "два", "три");
// list.add("четыре"); // Ошибка! UnsupportedOperationException
Это даёт гарантию неизменности и лучшую производительность, так как Java оптимизирует такие списки.
Совет для начинающих
Не пытайтесь писать "в одну строку" любой ценой. Иногда три строки с add() читаются лучше, особенно если элементы списка вычисляются или получаются из других источников. Используйте однострочную инициализацию только для статических, заранее известных данных.