ArrayList 扩容机制
初始容量:
ArrayList() 会使用长度为零的数组
ArrayList(int initialCapacity) 会使用指定容量的数组
public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量
1、ArrayList() 无参构造时,给的时一个空白的数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,所以ArrayList初始容量为0:
2、ArrayList(int initialCapacity)时,参数为 initialCapacity,所以数组的容量为指定的容量:
3、ArrayList(Collection<? extends E> c)时,会使用集合c的大小作为数组的容量:
扩容的方式:
add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍
addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)
1、add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍
-
首次扩容会从0扩容成10,然后把添加到容量为0的数组中,然后长度为10的数组的替换长度为0的数组,然后丢弃数组为0的数组
第二次扩容会扩容到上一次容量的1.5倍,1.5倍指的是:先求扩容前容量的一半,然后再加入扩容前的容量===> 10>>1=5 ; 5+10=15
首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的1.5倍,比如0,10,15,22,33…….
2、addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)
比如:list初始容量为0,然后调用addAll()进行扩容,首次扩容为容量是10,然后我们add 容量为11的数组,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(10,11)===>11
比如:数组list已经有10个元素了,然后再add(1,2,3) 3个元素,会调用addAll()进行扩容,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(15,13)===>15