比较
集合 | 默认初始化大小 | 扩容大小 |
---|---|---|
ArrayList | 10 | 1.5 |
Vector | 10 | 2(默认) |
HashMap | 16 | 2(阈值0.75) |
HashTable | 11 | 2倍+1(阈值0.75) |
ArrayList
无参构造器
由无参方法我们可以得到ArrayList如果不指定数组大小则它开始的大小为0,如果我们指定了初始大小,则elementData 的初始大小就变成了我们所指定的初始大小了
#无参构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//默认的空数组常量
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMEN TDATA = {
};
首次使用
默认容量大小为10
在插入元素之前,它会先检查是否需要扩容,然后再把元素添加到数组中最后一个元素的后面。在 ensureCapacityInternal 方法中,
我们可以看见,如果当 elementData 为空数组时,它会使用默认的大小去扩容。所以说,通过无参构造方法来创建 ArrayList 时,它的大小其实是为 0 的,只有在使用到的时候,才会通过 grow 方法去创建一个大小为 10 的数组。
private static final int DEFAULT_CAPACITY = 10;
扩容
grow 方法是在数组进行扩容的时候用到的,从中我们可以看见,ArrayList 每次扩容都是扩 1.5 倍,然后调用 Arrays 类的 copyOf 方法,把元素重新拷贝到一个新的数组中去。
private void grow(int minCapacity) {
// overflow-conscious code