前言
ArrayList 底层是基于数组实现的,不过得益于其扩容机制,它可以看作是一个动态的数组,弥补了数组长度是定长的缺陷。
在往 ArrayList 里添加元素时,如果添加完元素之后,元素的总个数大于当前数组的容量,会执行扩容,这个扩容的过程可以归纳为以下两个步骤:
- 确定新数组的容量
- 将老数组内的元素拷贝到新数组中去
确定新数组的容量这一步是本文重点,接下来我们一起来看一下。
确定扩容后的数组容量
阅读 ArrayList 的源码,我们会发现不论是执行 add() 还是 addAll() 方法(包括 add() 、addAll() 方法的重载版本也是一样,只不过下面没有贴出来),它在正式添加元素之前,都会先执行 ensureCapacityInternal(int minCapacity)
这个方法来确保容量足够。
传入的参数是添加完元素之后元素的总个数(但要清楚此时还没有进行元素的添加),即扩容后的最小容量:minCapacity,我希望你暂时记住这个参数的意义,后面的源码会不停的根据这个参数做文章。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a