以如下代码为例,对底层扩容代码解读
public void ArrayListSource1() {
ArrayList list = new ArrayList();
//ArrayList list = new ArrayList(8);
for(int i = 1; i <= 10; i++) {
list.add(i);
}
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
无参构造器 ArrayList List = new ArrayList();
创建一个空的elementData数组={}
执行list.add (1) 先确定是否要扩容 (2)再添加
(1)首先执行calculateCapacity,返回minCapacity (2) 执行ensureExplicitCapacity
该方法确定minCapacity,(1) 第一次扩容为10
(1) modCount++ 记录被修改的次数 (2) 如果elementData的大小不够,将会去调用grow()
(1)真的扩容 (2)使用扩容机制来确定要扩容到多大 (3) 第一次newCapacity扩容为10 (4)第二次及其以后,扩容为之前的1.5倍(newCapacity = oldCapacity + (oldCapacity >> 1) 新的容量为旧容量 + 旧容量右移一位即旧容量/2) (5) 扩容使用Arrays.copyOf
有参构造器 ArrayList List = new ArrayList(8);
创建一个指定大小的elementData数组 this.elementData = new Object[initialCapacity] 之后的扩容机制与无参构造一样