总结:
无参构造:初始化一个空数组,第一次扩容到10,往后是1.5倍扩容。
有参构造:指定长度扩容,初始化指定长度的数组,当数组长度不够用的时候,以指定长度的1.5倍扩容。
第一种: ArrayList arrayList = new ArrayList();
无参构造,给elementData赋值DEFAULTCAPACITY_EMPTY_ELEMENTDATA,这是个空数组。
我们走add方法看看,ensureCapacityInternal 翻译过来是:确保内部容量。把size看作集合的长度,size初始是0,只有每次走add方法最后时,size才会+1,因为是第一次添加,所以size为0,minCapacity意思是最小容量,size+1=1,意思是我们第一次添加1个的时候,最小容量也确实是需要1个容量,size+1没毛病。
进入这个方法看看
判断elementData是不是空数组,如果是空数组时,取DEFAULT_CAPACITY、minCapacity俩个值的最大值,所以取10,把10赋值给minCapacity
我们进入ensureExplicitCapacity方法,翻译过来是:确认明确容量
modCount,记录修改次数,防止多线程同时操作,抛出异常。只做稍微了解
所需要的最小容量大于当前数组的长度,进行扩容,走grow方法
当前的数组长度赋值给oldCapacity(老容量),
int newCapacity = oldCapacity + (oldCoapacity >> 1); oldCoapacity向右偏移一位,意思是除以2,这里就可以看出扩容是1.5倍扩容。
由于是一次add,newCapacity计算后记过还是0,if判断后newCapacity=10,然后
Arrays.copyOf(elementData, newCapacity);复制老数组给新数组
最后把元素添加到数组里
第二种: new ArrayList(8); 指定长度创建。创建一个指定长度的数组赋值给elementData。
当集合已经添加完8个元素之后,进行扩容,是8的1.5倍扩容