前言
在了解这个类之前,先了解它解决了什么问题。ArrayList 的出现是为了解决数组无法动态扩容的缺陷,使用 java 的数组需要在创建数组时便确定数组的容量,因为数组本身不会自动扩容。对于元素数量不确定的场景如果使用数组则需要预估所需的数组容量,如果估少了还需要重新申请空间并对原数组进行拷贝。这些代码逻辑在每一个用到数组的场景都需要重复进行处理,所以 ArrayList 对这部分重复编码的逻辑进行了封装,实现了动态扩容的效果。
既然 ArrayList 解决了数组扩缩容问题,那么其就相当于是一种创新型的数据结构,对应的它也需要解决好增删查改的问题,后面我们就从增删查改四个维度看一下它的实现方案。
增删查改
增
Add 数据的第一步是创建 ArrayList,其有三个构造函数,分别是用指定容量创建,无参构造创建和使用别的 Collection 来创建新的 ArrayList。这其中如果采用无参构造创建那么默认的 elementData 会被设置成 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,这是一个空数组,你会发现它和 EMPTY_ELEMENTDATA 这个空数组被区分开了,其目的是为了判断出如果以无参构造创建 ArrayList,那么第一次添加元素时数组最小容量会被设置为 DEFAULT_CAPACITY,也就是下面这段代码控制。
private int newCapacity(int minCapacity) {
// ...
// 这里会判断是不是默认容量空数组,是的话最小容量会用 DEFAULT_CAPACITY
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity