Создание массива ArrayList в Java: правильный синтаксис

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
ArrayList<Integer>[] arrayOfArrayLists = new ArrayList[10];
// Инициализация массива с использованием Java 8
Arrays.setAll(arrayOfArrayLists, i -> new ArrayList<>());

Этот код инициализирует массив, состоящий из 10 объектов ArrayList<Integer>.

Кинга Идем в IT: пошаговый план для смены профессии

Создание массива ArrayList'ов

Создать массив с обобщенными типами вроде new ArrayList<Integer>[10], не получится из-за механизма стирания типов в Java и запрета на создание массивов с обобщенными типами. Альтернативой станет использование списка списков, что обеспечит типовую безопасность и поможет избежать проблем, связанных с массивами параметризованных типов:

Java
Скопировать код
List<List<Integer>> listOfLists = new ArrayList<>();

Если вам необходим именно массив ArrayList'ов, то можно поступить следующим образом:

Java
Скопировать код
// Игнорирование тривиальных предупреждений
@SuppressWarnings("unchecked")
ArrayList<Integer>[] arrayOfLists = (ArrayList<Integer>[]) new ArrayList[10];

Не забудьте о инициализации элементов массива:

Java
Скопировать код
for (int i = 0; i < arrayOfLists.length; i++) {
    arrayOfLists[i] = new ArrayList<>();
}

Гибкость коллекционных классов

Для большей универсальности и абстракции рекомендуется использовать интерфейс List, что позволит легко перетекать между различными реализациями:

Java
Скопировать код
List<List<String>> bookGenres = new ArrayList<>();

Создание пользовательских ArrayList

Для достижения гибкости можно создать свой собственный класс, основанный на ArrayList, что позволит эффективно объединить логику воедино и следовать принципу DRY (Don't Repeat Yourself — не повторяй себя):

Java
Скопировать код
public class MyArrayList<T> extends ArrayList<T> {
    // Расширенные возможности ArrayList!
}
MyArrayList<Integer>[] myCustomArrays = (MyArrayList<Integer>[])new MyArrayList[10];

Явное приведение типов с использованием Wildcards

Иногда приходится работать с массивами, использующими универсальные типы-подстановки:

Java
Скопировать код
ArrayList<?>[] wildCardArray = new ArrayList<?>[10];

В этом случае придется явно приводить элементы к нужным типам при работе с ними.

Визуализация

Рассмотрим пример:

Markdown
Скопировать код
Книжная полка в библиотеке (📚): [Детективы🕵️‍♀️, Научная фантастика👽, Романы❤️, История🏰, Фэнтези🐉]

Каждая категория соответствует ArrayList, а вся полка ассоциируется с массивом.

Java
Скопировать код
ArrayList<String>[] libraryShelf = new ArrayList[5];

[Детективы🕵️‍♀️] = динамичный список детективов [Научная фантастика👽] = динамичный список научно-фантастических произведений ... и так далее для каждого жанра.

Таким образом, каждый список представляет собой набор книг в представленной категории.

Работа с примитивными типами

Java предлагает синтаксический сахар в виде оберток над примитивными типами, как Integer, Double и прочие для создания списков примитивных типов:

Java
Скопировать код
List<List<Integer>> scores = new ArrayList<>();

Null элементы

Всегда убедитесь, что объект не равен null, чтобы избежать исключения NullPointerException.

Java
Скопировать код
if (arrayOfArrayLists[i] != null) {
    // Всё в порядке, объект существует!
}

Советы по производительности

ArrayLists в сравнении с обычными массивами предлагают динамическое изменение размера, что особенно полезно, если вы не можете заранее предсказать объем данных. В результате использование массива ArrayList может повысить производительность при частых операциях добавления и удаления элементов.

Полезные материалы

  1. ArrayList (Java Platform SE 8)официальная документация Java, для познания ArrayList.
  2. Arrays (Java Platform SE 8)официальная документация, рассказывающая о массивах в Java.
  3. Урок: Обобщения (обновлено) (The Java™ Tutorials > Изучение языка Java)детальный урок от Oracle об обобщениях в Java.
  4. Generics in Java – GeeksforGeeks — указания по обобщенному программированию и типовой безопасности.
  5. Java Practices->Serialization and subclassing — аналитическая заметка о массивах с обобщенными типами.