Инициализация ArrayList в одну строку в Java: лучшие способы
Инициализация ArrayList в одну строку: лучшие практики
Да, в Java есть несколько способов инициализировать ArrayList в одну строку. Разберём самые популярные и правильные подходы, начиная с рекомендуемого.
1. Двойная инициализация (Double Brace Initialization) — НЕ РЕКОМЕНДУЕТСЯ
Многие начинающие разработчики находят этот способ:
ArrayList<String> list = new ArrayList<>() {{
add("Яблоко");
add("Банан");
add("Апельсин");
}};
Почему это плохо?
- Создаётся анонимный внутренний класс, что приводит к утечке памяти.
- Не работает с
equals()— два таких списка будут считаться разными классами. - Производительность ниже из-за создания дополнительного класса.
2. Использование Arrays.asList() — БЫСТРО, НО С ОГРАНИЧЕНИЯМИ
Самый короткий способ:
List<String> list = Arrays.asList("Яблоко", "Банан", "Апельсин");
Важно: этот метод возвращает List фиксированного размера. Вы не сможете добавить или удалить элементы:
list.add("Груша"); // Бросит UnsupportedOperationException!
list.remove("Банан"); // Тоже исключение!
Но вы можете изменять существующие элементы (set() работает).
3. Правильный способ: new ArrayList<>(Arrays.asList())
Если вам нужен полноценный изменяемый список:
ArrayList<String> list = new ArrayList<>(Arrays.asList("Яблоко", "Банан", "Апельсин"));
Это создаёт новый ArrayList, в который копируются все элементы из списка, созданного Arrays.asList(). Теперь вы можете добавлять, удалять и изменять элементы как обычно.
4. Java 9+: List.of()
Начиная с Java 9, появился удобный фабричный метод:
List<String> list = List.of("Яблоко", "Банан", "Апельсин");
Однако этот список неизменяемый (immutable). Если вам нужно изменять список, оберните его в ArrayList:
ArrayList<String> list = new ArrayList<>(List.of("Яблоко", "Банан", "Апельсин"));
5. Stream API (Java 8+)
Для более сложных случаев или когда нужно преобразовать данные:
ArrayList<String> list = Stream.of("Яблоко", "Банан", "Апельсин")
.collect(Collectors.toCollection(ArrayList::new));
Сравнение всех способов
| Способ | Изменяемый? | Java версия | Рекомендация |
|---|---|---|---|
| Arrays.asList() | Нет (фикс. размер) | 1.2+ | Только для чтения |
| new ArrayList<>(Arrays.asList(...)) | Да | 1.2+ | Лучший для Java 7 и ниже |
| List.of() | Нет (immutable) | 9+ | Для неизменяемых списков |
| Stream API | Да | 8+ | Для сложных преобразований |
Итоговая рекомендация
Если вы используете Java 8 или ниже, используйте:
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Если у вас Java 9+ и список не будет изменяться:
List<String> list = List.of("a", "b", "c");
Если нужен изменяемый список на Java 9+:
ArrayList<String> list = new ArrayList<>(List.of("a", "b", "c"));
Избегайте двойной инициализации — это антипаттерн, который может привести к трудноуловимым багам и проблемам с памятью.
<<Альтернативный подход: Guava от Google
Если вы уже используете библиотеку Google Guava (а это очень популярная библиотека для Java), то у неё есть удобные методы для создания коллекций в одну строку:
// Иммутабельный список (неизменяемый)
ImmutableList<String> list = ImmutableList.of("Яблоко", "Банан", "Апельсин");
// Изменяемый ArrayList
ArrayList<String> mutableList = Lists.newArrayList("Яблоко", "Банан", "Апельсин");
Преимущества Guava:
ImmutableList— гарантирует, что список не будет изменён случайно (потокобезопасен).Lists.newArrayList()— создаёт полноценный изменяемыйArrayListбез лишних обёрток.- Метод
ImmutableList.copyOf()позволяет создать неизменяемую копию из любого существующего списка.
Пример с добавлением элементов позже:
ArrayList<String> list = Lists.newArrayList("Яблоко", "Банан");
list.add("Груша"); // Работает!
Недостаток: нужно добавить зависимость Guava в проект (Maven/Gradle). Но эта библиотека настолько популярна, что она часто уже есть в проекте. Если её нет — возможно, стоит подумать о её добавлении, так как она предоставляет много полезных утилит для работы с коллекциями, строками, кэшированием и т.д.
Совет: если вы не хотите подключать сторонние библиотеки, используйте стандартный способ new ArrayList<>(Arrays.asList(...)) — он работает во всех версиях Java и не требует дополнительных зависимостей.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги