arraylist中参数(int初始容量)的含义是什么

Ism*_*ush 19 java initialization arraylist

参数(int initialCapacity)中的含义是什么ArrayList,我认为它是元素的数量,但是当我这样做时它不起作用:

public class MyClass {
    private ArrayList<Integer> arr;
    public MyClass(int n_elements) {
        arr = new ArrayList<Integer>(n_elements);
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 39

它是初始容量,ArrayList即将作为项目的内部存储开始分配的项目数.

ArrayList可以包含"任意数量的项目"(只要你有内存),并且当进行大的初始插入时,你可以ArrayList分配一个更大的存储开始,以便在它试图为其分配更多空间时不浪费CPU周期.下一个项目.

例:

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
Run Code Online (Sandbox Code Playgroud)

  • 确切地说:"任意数量的项目"限于"Integer.MAX",因为java中的数组是由int编入索引的(从Java 6开始). (4认同)
  • 我反对第一句中的"默认"一词.如果你*不在括号中加一个数字,*default*number是分配的大小. (3认同)
  • @Carl:你是对的.将其更改为*初始容量*,以符合Java文档. (2认同)

Car*_*arl 10

实际上,ArrayList在后台调整大小之前,可以添加多少元素,如果使用正确,可以节省一些周期.


dac*_*cwe 7

容量是对象内部存储的大小.内部存储始终大于或等于列表的size()(以便它可以包含所有元素).

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行这个给出:

initial size = 0
initial capacity = 10
size = 11
capacity = 16
Run Code Online (Sandbox Code Playgroud)


Leg*_*ato 5

在引擎盖下,ArrayList本质上是一个动态数组。每次使用new Arraylist<>()发生的情况进行实例化时,都会创建一个数组来保存要存储的值,其默认容量(不要与 size 混淆)为 10。

每次添加一个会增加超出容量大小的值时,都会创建一个新数组,其容量是先前容量的 150% 以上,其中复制了先前数组的内容。

如果您大致了解结果列表的大小,或者确定但希望通过在数组上使用数组列表提供灵活性,您可以设置容量以防止这种重复创建新数组、复制旧数组内容的过程新的,并摆脱旧的——否则,出现的次数将与列表的大小成正比。