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)
容量是对象内部存储的大小.内部存储始终大于或等于列表的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)
在引擎盖下,ArrayList本质上是一个动态数组。每次使用new Arraylist<>()发生的情况进行实例化时,都会创建一个数组来保存要存储的值,其默认容量(不要与 size 混淆)为 10。
每次添加一个会增加超出容量大小的值时,都会创建一个新数组,其容量是先前容量的 150% 以上,其中复制了先前数组的内容。
如果您大致了解结果列表的大小,或者确定但希望通过在数组上使用数组列表提供灵活性,您可以设置容量以防止这种重复创建新数组、复制旧数组内容的过程新的,并摆脱旧的——否则,出现的次数将与列表的大小成正比。
| 归档时间: |
|
| 查看次数: |
25427 次 |
| 最近记录: |