Создание массива ArrayList в Java: правильный синтаксис
Быстрый ответ
ArrayList<Integer>[] arrayOfArrayLists = new ArrayList[10];
// Инициализация массива с использованием Java 8
Arrays.setAll(arrayOfArrayLists, i -> new ArrayList<>());
Этот код инициализирует массив, состоящий из 10 объектов ArrayList<Integer>
.
Создание массива ArrayList'ов
Создать массив с обобщенными типами вроде new ArrayList<Integer>[10]
, не получится из-за механизма стирания типов в Java и запрета на создание массивов с обобщенными типами. Альтернативой станет использование списка списков, что обеспечит типовую безопасность и поможет избежать проблем, связанных с массивами параметризованных типов:
List<List<Integer>> listOfLists = new ArrayList<>();
Если вам необходим именно массив ArrayList'ов
, то можно поступить следующим образом:
// Игнорирование тривиальных предупреждений
@SuppressWarnings("unchecked")
ArrayList<Integer>[] arrayOfLists = (ArrayList<Integer>[]) new ArrayList[10];
Не забудьте о инициализации элементов массива:
for (int i = 0; i < arrayOfLists.length; i++) {
arrayOfLists[i] = new ArrayList<>();
}
Гибкость коллекционных классов
Для большей универсальности и абстракции рекомендуется использовать интерфейс List
, что позволит легко перетекать между различными реализациями:
List<List<String>> bookGenres = new ArrayList<>();
Создание пользовательских ArrayList
Для достижения гибкости можно создать свой собственный класс, основанный на ArrayList
, что позволит эффективно объединить логику воедино и следовать принципу DRY (Don't Repeat Yourself — не повторяй себя):
public class MyArrayList<T> extends ArrayList<T> {
// Расширенные возможности ArrayList!
}
MyArrayList<Integer>[] myCustomArrays = (MyArrayList<Integer>[])new MyArrayList[10];
Явное приведение типов с использованием Wildcards
Иногда приходится работать с массивами, использующими универсальные типы-подстановки:
ArrayList<?>[] wildCardArray = new ArrayList<?>[10];
В этом случае придется явно приводить элементы к нужным типам при работе с ними.
Визуализация
Рассмотрим пример:
Книжная полка в библиотеке (📚): [Детективы🕵️♀️, Научная фантастика👽, Романы❤️, История🏰, Фэнтези🐉]
Каждая категория соответствует ArrayList, а вся полка ассоциируется с массивом.
ArrayList<String>[] libraryShelf = new ArrayList[5];
[Детективы🕵️♀️]
= динамичный список детективов
[Научная фантастика👽]
= динамичный список научно-фантастических произведений
... и так далее для каждого жанра.
Таким образом, каждый список представляет собой набор книг в представленной категории.
Работа с примитивными типами
Java предлагает синтаксический сахар в виде оберток над примитивными типами, как Integer
, Double
и прочие для создания списков примитивных типов:
List<List<Integer>> scores = new ArrayList<>();
Null элементы
Всегда убедитесь, что объект не равен null, чтобы избежать исключения NullPointerException
.
if (arrayOfArrayLists[i] != null) {
// Всё в порядке, объект существует!
}
Советы по производительности
ArrayLists
в сравнении с обычными массивами предлагают динамическое изменение размера, что особенно полезно, если вы не можете заранее предсказать объем данных. В результате использование массива ArrayList
может повысить производительность при частых операциях добавления и удаления элементов.
Полезные материалы
- ArrayList (Java Platform SE 8) — официальная документация Java, для познания ArrayList.
- Arrays (Java Platform SE 8) — официальная документация, рассказывающая о массивах в Java.
- Урок: Обобщения (обновлено) (The Java™ Tutorials > Изучение языка Java) — детальный урок от Oracle об обобщениях в Java.
- Generics in Java – GeeksforGeeks — указания по обобщенному программированию и типовой безопасности.
- Java Practices->Serialization and subclassing — аналитическая заметка о массивах с обобщенными типами.