Arraylist动态扩容

JDK1.7环境

1、构造参数

ArrayList() 

ArrayList(int initialCapacity)  用指定的大小来初始化内部的数组

ArrayList(Collection<? extends E> c)用一个ICollection对象来构造,并将该集合的元素添加到ArrayList

2、ArrayList() 

ArrayList list = new ArrayList<String>();

总结:初始数组容量为10,每次通过copeOf的方式扩容,后容量为原来的1.5倍

源码:

只是把elementData对象数组初始化了一个空对象数组。

elementData:存储ArrayList元素的数组缓冲区。ArrayList的容量是此数组缓冲区的长度。所以此时ArrayList容量为0;

当执行list.add()方法时,ArrayList才初始化有大小容量数组

第一次调用add()时,elementData == EMPTY_ELEMENTDATA会相等,并且值都是空数组。

第一次调用minCapacity=1,

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);取值是获取DEFAULT_CAPACITY 的值

在ensureExplicitCapacity方法中,第一次add()方法,此时minCapacity= 10,elementData.length=1,

所以不会进入grow()方法。

当minCapacity大于10,会执行grow()进行扩容计算,

例如:

向数组中添加到第11个元素时,数组容量扩为15. 

int  newCapacity =  10 +  (10 >> 1) = 15

      向数组中添加到第16个元素时,数组容量扩为22.

int  newCapacity =  15+  (15>> 1) = 22

 

猜你喜欢

转载自blog.csdn.net/u012965203/article/details/91867567