ArrayList继承自AbstractList,实现List接口,是一个可变长的列表。
不同于LinkedList,LinkedList底层由链表实现,所以只需维护好底层链表,即可实现列表的长度变化。而ArrayList底层由数组实现,数组初始化需要指定长度,所以想要实现可变长的列表,ArrayList底层肯定做了一些小动作来支持。今天看了下ArrayList的源码,记录一下它的扩容机制。
首先,需要了解类内的这6个属性:
/**
* 列表默认的初始化容量,10
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 空数组,用于空对象。static修饰可以减少存储空间的开销
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 也是一个空数组。为啥又定义一个空数组?官方注释说这个空数组和上面的是有区别的
* 这个数组用于初始化一个默认长度的列表,在下面的构造函数中会讲到
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 这是具体存元素的数组引用,ArrayList的size也是该引用数组的长度。
* 如果elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* 那么在添加第一个元素时,elementData会被初始化为一个默认长度的数组
*/
transient Object[] elementData; // non-p