ArrayList arrayList = new ArrayList();//无参的构造器 ArrayList arrayList1 = new ArrayList(8); //使用for循环添加1-10个数据 for(int i=1;i<=10;i++){ arrayList.add(i); } for(int i=11;i<=15;i++){ arrayList.add(i); } arrayList.add(100); arrayList.add(200); arrayList.add(null);
使用new ArrayList();进行构造函数时调用的是以下的构造器,因此elementData初始化是一个空数组,
ensureExplicitCapacity(10); minCapacity为最小期望大小=10,判断10-0》0 需要进行grow(minCapacity)需要进行扩容到minCapacity
执行到arraList.add(i); 初始时,size=0;,进入ensureCapacityInternal(0+1);最小容量minCapacity=1,
判断当前elementDat是否==DEFALUTTCAPACITY_EMPTY_ELEMENTDATA,判断为true,Math.max(DEFAULT_CAPACITY,minCapacity) ,即Math.max(10,1) 返回10.故调用所以返回10,否则不是第一次扩容就返回真正需要扩容的大小
进行扩容判断,使用minCapacity-当前数组的长度,如果小于0就进行扩容,即调用grow(minCapacity).因为当前minCapacity=10,elementData.length=0,所以调用grow(10),进行第一次扩容,扩容10个长度
首先获取原始数组的长度 oldCapacity,然后设置新扩容数组长度为 原数组长度的1.5倍。
因为第一次扩容,新扩容数组长度=0+0/2=0; 所以0<10;设置newCapacity=10;
然后执行Arrays.copy(elementData,10) 把数组的容量扩容为10
后面的数组如果不够的话,就都会在原数组长度的基础上扩1.5倍了,因为elementData不在是DEFALUTTCAPACITY_EMPTY_ELEMENTDATA。
以上就是涉及到ArraList数组动态扩容机制的源码部分