Длина и размер Java ArrayList

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

ArrayList не раскрывает публично длину резервного массива, и с помощью метода size() можно получить только количество сохраненных элементов.

1. Внутренняя реализация ArrayList

Внутренне класс ArrayList реализован с использованием массива(также называемого резервным массивом). Элементы, которые добавляются или удаляются из ArrayList, фактически изменяются в резервном массиве.

public class ArrayList<E>... {transient Object[] elementData; //backing arrayprivate int size; //arraylist size//...}

Когда мы добавляем объекты в arraylist, и они сохраняются в backing array. Количество элементов, сохраненных в массиве, отслеживается с помощью атрибута size.

2. Размер ArrayList

Размер ArrayList относится к количеству элементов(включая нулевые значения), хранящихся в ArrayList.

  • Когда мы добавляем элемент в любое место массива, размер увеличивается на 1.
  • При удалении элемента размер уменьшается на 1.
  • При замене элемента его размер не меняется.
  • Когда мы очищаем ArrayList, размер сбрасывается до 0.

Давайте проверим вышеприведенные случаи на примере. Мы инициализируем пустой arraylist и выполним несколько операций добавления/удаления/очистки. После каждой операции мы проверим размер arraylist.

ArrayList<Integer> arraylist = new ArrayList<>();Assertions.assertEquals(0, arraylist.size()); //Initial size = 0arraylist.add(1001);Assertions.assertEquals(1, arraylist.size()); //Add increments the size by 1arraylist.add(1002);Assertions.assertEquals(2, arraylist.size()); //Add increments the size by 1arraylist.set(0, 1000);Assertions.assertEquals(2, arraylist.size()); //replace does not change the sizearraylist.remove(1002);Assertions.assertEquals(1, arraylist.size()); //remove decrements the size by 1arraylist.clear();Assertions.assertEquals(0, arraylist.size()); //clear resets the size to 0

3. Длина ArrayList

Длина arraylist — это длина резервного массива. Но, поскольку класс ArrayList не раскрывает начальную емкость, нет способа проверить длину с помощью публичных API.

Обратите внимание, что начальная емкость arraylist по умолчанию равна 10, что создает пустой резервный массив длиной 10. Таким образом, пустой arraylist, созданный с помощью конструктора без аргументов по умолчанию, всегда имеет резервный массив длиной 10. Мы можем указать пользовательскую начальную емкость(или длину массива) в качестве аргумента конструктора.

ArrayList<Integer> arraylist = new ArrayList<>(); // backing array of length 10ArrayList<Integer> arraylist = new ArrayList<>(64); // backing array of length 64

4. ArrayList trimToSize()

Интересный метод trimToSize() делает длину экземпляра ArrayList текущей длиной списка. Приложение может использовать эту операцию для минимизации хранения экземпляра ArrayList.

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

arraylist.trimToSize();

5. Заключение

Класс Java ArrayList не раскрывает длину резервного массива для простоты и раскрывает только количество текущих сохраненных в нем элементов с помощью метода size(). Тем не менее, полезно знать концепцию длины, чтобы мы могли использовать метод trimToSize(), когда резервный массив содержит достаточно индексов, указывающих на отсутствие значений.

Прокрутить вверх