ArrayList -动态扩容
通过源码看ArrayList底层是如何扩容的。
ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size(真实有效的个数)。
Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。
一、初始化
二、add元素
ensureCapacityInternal(size + 1); 此时size 就是0,ensureCapacityInternal(1);
因为elementData是默认值,所以进入if流程,那么minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);就等于DEFAULT_CAPACITY的值10。
继续往下走,ensureExplicitCapacity(10)。此时进入if流程,进行扩容。最终返回的就是长度为10的数组。
最终添加数据完成,elementData从第0个元素开始。
三、addAll(int index,Collection()T)
这里请记住非常重要的一点:size指的是真是存在数组中的元素个数,而不是elementData的个数。
通过上面的分析过程可以得知 ensureCapacityInternal(size + numNew); 是不需要扩容的。
那么首先判断是否需要移动elementData中的数据,答案是显而易见的。
此时形成的elementData = {"a","b","c","b","c",null,"","","",""};
下面就进入第二次的数组copy过程。
最终形成我们所需要的数据elementData = {"a","VV","CC","b","c",null,"","","",""};