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,"","","",""};

猜你喜欢

转载自qiguanjiaduobao.iteye.com/blog/2369056