Что подразумевается под параметром (int initial capacity) в arraylist

Что означало параметр (int initialCapacity) в ArrayList, я думал, что это число элементов, но это не сработало, когда я сделал это:

public class MyClass {
    private ArrayList<Integer> arr;
    public MyClass(int n_elements) {
        arr = new ArrayList<Integer>(n_elements);
    }
}

Ответ 1

Это начальная емкость, то есть количество элементов, которые ArrayList будет выделять для начала, как внутреннее хранилище элементов.

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

Пример:

ArrayList list = new ArrayList<Integer>(2);
list.add(1); // size() == 1
list.add(2); // size() == 2, list is "filled"
list.add(3); // size() == 3, list is expanded to make room for the third element

Ответ 2

Практически говоря, сколько элементов вы можете добавить в ArrayList до того, как оно изменится в фоновом режиме, что может сэкономить вам несколько циклов при правильном использовании.

Ответ 3

Емкость - это размер внутренней памяти объектов. Внутреннее хранилище всегда больше или равно размеру() списка (чтобы он мог содержать все элементы).

public class Main {
    public static void main(String[] args) throws Exception {

        ArrayList<Integer> arr = new ArrayList<>();
        System.out.println("initial size = " + arr.size()); // 0
        System.out.println("initial capacity = " + getCapacity(arr));

        for (int i = 0; i < 11; i++)
            arr.add(i);

        System.out.println("size = " + arr.size()); // 11
        System.out.println("capacity = " + getCapacity(arr));
    }

    static int getCapacity(ArrayList<?> l) throws Exception {
        Field dataField = ArrayList.class.getDeclaredField("elementData");
        dataField.setAccessible(true);
        return ((Object[]) dataField.get(l)).length;
    }
}

Запуск этого дает:

initial size = 0
initial capacity = 10
size = 11
capacity = 16

Ответ 4

Под капотом ArrayList представляет собой динамический массив . Каждый раз, когда вы создаете экземпляр new Arraylist<>(), что происходит, создается массив для хранения значений, которые вы хотите сохранить, чья емкость по умолчанию, , чтобы не путать с размером, является 10.

Каждый раз, когда вы добавляете значение, которое увеличивает размер за пределами емкости, создается новый массив, чья емкость составляет более 150% предыдущей емкости с содержимым предыдущего массива, скопированного внутри.

Если у вас есть общее представление о том, какой размер результирующего списка будет, или он определен, но желать гибкости, предоставляемой от использования arraylists над массивами, вы можете установить возможность предотвратить этот повторяющийся процесс создания новых массивов, скопировав содержимое старый массив в новом, и избавиться от старого, что в противном случае увеличится вхождениях, пропорциональных размеру списка.