ArrayList的扩容底层机制
关于ArrayList的扩容机制
一、使用无参构造的方式创建
1、首先创建了一个空的elementData数组
DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
2、如果添加的数据类型是基础类型的包装类,首先都会进行自动装箱操作,如果是Double就调用Double的valueof()方法,并返回
3、进入add()
3.1 在add()方法中首先调用ensureCapacityInternal(size+1),确认容量大小是否扩容,然后将元素在赋值给elementData[Size++]=e;
该方法确定初始的minCapacity,第一次默认扩容为10.
3.2如果elementData的大小不够,就调用grow()方法去扩容.
3.3第一次调用grow方法,分析下列扩容机制,可知newCapacity=10
扩容成功,elementData数组中有10个空元素
4.进行赋值,size初始值为0,elementData[Size++]=e; 并return true;
5.添加成功第一个元素后,elementData数组第一个位置就有值了,size+1,modcount+1.
5.当如果加入10元素满了后,再加入第11个元素的时候,又进行重新的扩容.
5.1进入add方法,调用ensureCapacityInternal(10+1)
5.2 11>10,进入grow(11).
5.3 由原来的10扩容为15,之后的扩容都是为原来的1.5倍
二、使用带参构造的方式创建
有如下代码:
ArrayList<Object> arrayList = new ArrayList<>(8);
for (int i = 1; i <=10 ; i++) {
arrayList.add(i);
}
2.1首先进入带参构造方法
2.2下面其他的步骤跟无参构造的步骤都一样,扩容机制都为
int newCapacity = oldCapacity + (oldCapacity >> 1);
在原来的initialCapacity的基础上扩容1.5倍