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