Java中的ArrayList是一个动态数组,可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据,例如String,Integer,Boolean等。ArrayList实现了List接口,可以进行常见的List操作,例如添加、插入、删除和访问元素等。
源码分析(JDK1.8)
/**
* 默认长度为10
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 用于空实例的共享空数组实例
* 是为了优化创建ArrayList空实例时产生不必要的空数组,使所有的ArrayList空实例底
* 层数据结构都指向同一个空数组
* 例如:当构造参数是指定的长度,且为0
* 当构造参数是一个集合,且该参数集合中的元素个数为0
*/
private static final Object[] EMPTY_ELEMENTDATA = {
};
/**
* 用于默认大小的空实例的共享空数组实例。
* 将其与EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时要扩容多少
* 用于标记当前ArrayList是使用空参构造的,在第一次使用add添加元素时,数组的最大长度直接使用默认的10
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
/**
* ★ 存储ArrayList元素的数组缓冲区,ArrayList的容量就是这个数组缓冲区的长度
* 添加第一个元素时,任何elementData==DEFAULTCAPACITY_empty_elementData的空ArrayList
* 都将扩展为DEFAULT_CAPACITY(默认初始容量10)
*/
transient Object[] elementData;
/**
* ★ 记录ArrayList 的元素个数
*/
private int size;
/**
* ★ 数组最大的长度
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
ArrayList 有三个构造函数,空参构造方法,指定初始容量值构造方法和指定集合元素列表的构造方法,如果集合中的元素不为空,新建的ArrayList集合中的元素顺序就是构造参数中的元素顺序
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
//当指定参数大于0时,真实存储数据的数据长度就是指定值
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
//当指定参数等于0时,使用空数组
this.elementData = EMPTY_ELEMENTDATA;
} else {
//指定的长度参数不能小于0
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
}
}
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length)