上期我们已经逐句的解析了Arraylist的底层数据结构以及它的构造方法,不太熟悉的读者可以再去温故。
链接:ArrayList源码分析(底层数据结构,成员变量,构造方法)以及面试题(基于JDK1.8)
本期我们将在其基础上,进一步阅读关于ArrayList的添加元素、删除元素以及其扩容机制的代码,希望能让读者有所收获,也希望各位读者对于本文的小错误能不吝赐教,码海无涯,愿与大家共勉。
1,ArrayList源码add方法逐句解析
此处所提到的add方法,指add(E e)以及add(int index i,E element)方法,除此之外还有addAll方法,addAll方法通常用于将另一个集合的所有元素合并到当前的ArrayList中,读者可自行去了解,本处不再赘述其源码。接下来将以源码解析以及添加元素的具体过程两部分展开。
1,add源码解析
add(E e) 方法,是最常用的add
方法,它接受一个元素并将其添加到ArrayList
的末尾。如果添加成功,则返回true。
public boolean add(E e) {
ensureCapacityInternal(size + 1);
//调用确保内部数组elementData有足够的容量来存储新元素。
// 因为新元素将被添加到数组的末尾,所以需要检查数组是否有足够的空间。
elementData[size++] = e;
//将新元素添加到数组的末尾,并将数组的大小增加1。
return true;
}
我们注意到add(E e)调用了ensureCapacityInternal()方法,这个方法是用来确保内部数组elementData
至少能够容纳minCapacity
个元素,其代码如下。
private void ensureCapacityInternal(int minCapacity) {
//这个方法确保内部数组elementData至少能够容纳minCapacity个元素。
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
//通过调用ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));来实现,
// 后者计算所需的容量并确保达到这个容量。
}
仔细阅读代码可以发现,ensureCapacityInternal()方法主要通过调用,ensureExplicitCapacity方法以及calculate方法实现,这两个方法分别的作用为:
ensureExplicitCapacity:确保内部数组elementData
至少能够容纳minCapacity</