Рубрики
Без рубрики

Емкость ArrayList по сравнению с размером массива в Java

Емкость списка ArrayList зависит от размера массива. Мы исследуем различия, и когда это хорошая идея, чтобы установить размер Arraylist.

Автор оригинала: baeldung.

1. Обзор

Java позволяет нам создавать массивы фиксированного размера или использовать классы коллекций для выполнения аналогичной работы.

В этом уроке мы рассмотрим разницу между емкостью ArrayList и размером массива.

Мы также рассмотрим примеры того, когда мы должны инициализировать ArrayList с емкостью, а также преимущества и недостатки с точки зрения использования памяти.

2. Пример

Чтобы понять различия, давайте сначала попробуем оба варианта.

2.1. Размер массива

В java обязательно указывать размер массива при создании его нового экземпляра:

Integer[] array = new Integer[100]; 
System.out.println("Size of an array:" + array.length);

Здесь мы создали массив I integer размером 100, который привел к следующему выводу

Size of an array:100

2.2. Емкость ArrayList

Теперь давайте создадим ArrayList с начальной емкостью 100:

List list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());
Size of the list is :0

Поскольку элементы еще не были добавлены, размер равен нулю.

Теперь давайте добавим элемент в список и проверим его размер:

list.add(10);
System.out.println("Size of the list is :" + list.size());
Size of the list is :1

3. Размер в массивах по сравнению с ArrayList

Ниже приведены некоторые основные различия между размером массива и емкостью ArrayList.

3.1. Изменение размера

Массивы имеют фиксированный размер. Как только мы инициализируем массив с некоторым значением int в качестве его размера, он не может измениться. Размер и вместимость тоже равны друг другу.

Размер и емкость ArrayList не являются фиксированными. Логический размер списка изменяется в зависимости от вставки и удаления элементов в нем. Это управляется отдельно от размера физического хранилища. Кроме того, при достижении порога емкости ArrayList он увеличивает свою емкость, чтобы освободить место для большего количества элементов.

3.2. Выделение памяти

Память массива выделяется при создании. Когда мы инициализируем массив, он выделяет память в соответствии с размером и типом массива. Он инициализирует все элементы со значением null для ссылочных типов и значением по умолчанию для примитивных типов.

ArrayList изменяет распределение памяти по мере ее роста. Когда мы указываем емкость при инициализации ArrayList , он выделяет достаточно памяти для хранения объектов до этой емкости. Логический размер остается равным 0. Когда приходит время расширить емкость, создается новый, более крупный массив, и значения копируются в него.

Следует отметить, что существует специальный одноэлементный массив размером 0 для пустого ArrayList объекты, что делает их создание очень дешевым. Также стоит отметить, что ArrayList внутренне использует массив ссылок на объекты.

4. Когда инициализировать ArrayList с емкостью

Мы можем ожидать инициализации емкости ArrayList , когда мы знаем его необходимый размер до его создания, но обычно в этом нет необходимости. Однако есть несколько причин, по которым это может быть лучшим вариантом.

4.1. Построение большого списка массивов

Хорошо инициализировать список с начальной емкостью, когда мы знаем, что он станет большим. Это предотвращает некоторые дорогостоящие операции роста при добавлении элементов.

Аналогично, если список очень большой, операции автоматического увеличения могут выделить больше памяти, чем необходимо для точного максимального размера. Это связано с тем, что сумма, которая будет расти каждый раз, рассчитывается как доля от размера до сих пор. Таким образом, при больших списках это может привести к пустой трате памяти.

4.2. Построение небольших Множественных массивов

Если у нас много небольших коллекций, то автоматическая емкость ArrayList может обеспечить большой процент потерянной памяти. Допустим, что ArrayList предпочитает размер 10 с меньшим количеством элементов, но мы храним только 2 или 3. Это означает 70% потерянной памяти, что может иметь значение, если у нас будет огромное количество этих списков.

Установка емкости заранее может избежать этой ситуации.

5. Избегайте Отходов

Следует отметить, что ArrayList является хорошим решением для контейнера объектов гибкого размера, который поддерживает произвольный доступ. Он потребляет немного больше памяти, чем массив, но обеспечивает более богатый набор операций.

В некоторых случаях использования, особенно в больших коллекциях примитивных значений, стандартный массив может работать быстрее и использовать меньше памяти.

Аналогично, для хранения переменного числа элементов, доступ к которым не требуется по индексу, Связанный список может быть более эффективным. Это не связано с какими-либо накладными расходами на управление памятью.

6. Резюме

В этой короткой статье мы увидели разницу между емкостью ArrayList и размером массива. Мы также рассмотрели, когда мы должны инициализировать ArrayList с емкостью и его преимуществами в отношении использования памяти и производительности.

Как всегда, пример кода доступен на GitHub .