简介
ArrayList 是 Java 集合框架中比较常用的类,是用来存储数据的容器,可存储重复的元素,允许存储null
值,底层基于数组实现容量大小动态变化。由于 ArrayList 实现了 RandomAccess、Cloneable、Serializable 标志接口,所以 ArrayList 支持随机快速访问、复制、序列化。
成员变量
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
DEFAULT_CAPACITY:默认数组长度为10
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {
};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
EMPTY_ELEMENTDATA:使用有参构造方法创建对象但长度为0时数组的初始值
DEFAULTCAPACITY_EMPTY_ELEMENTDATA :使用无参构造方法创建对象时数组的初始值
两个都是空数组,那么有什么区别呢?简单来讲就是第一次添加元素时,用来分辨
elementData
是通过无参构造方法还是有参构造方法初始化的,以便确认如何扩容。
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* will be expanded to DEFAULT_CAPACITY when the first element is added.
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
elementData:真正用于存放元素的数组,elementData.length
表示能存储元素的最大容量值
size:数组元素的个数,指 elementData 实际存储了多少个元素
构造方法
// 无参构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; // elementData = {}
}
- 构造方法中将 elementData 初始化为空数组,首次添加元素时才会扩容,扩容至大小为
DEFAULT_CAPACITY = 10
// 参数为初始容量的构造方法
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
- 参数 > 0,elementData 初始化为指定大小的数组
- 参数 = 0,elementData 初始化为空数组
- 参数 < 0,抛出
Ille