前面已经分析完Java
的Map
、Set
容器源码,还剩List
相关的容器,此篇博客将分析List
接口的实现类之一ArrayList
容器的源码实现。
注明:以下源码分析都是基于jdk 1.8.0_221
版本
Java容器之ArrayList源码分析目录
一、ArrayList
容器概述
Java
中的ArrayList
类声明如下:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Java
中的ArrayList
容器是一个可动态调整大小
的数组
,每当我们往容器中插入元素都不必考虑容器是否装的下,其内部可以自动扩展大小。ArrayList
容器的实现原理是封装了一个数组,每当插入元素就判断当前数组是否还有空位置存放,如果没有空位置,则新建一个更长的数组,并且把之前的元素复制到新数组中。
二、ArrayList
类主要属性
ArrayList
类中的主要属性如下:
/**
* 默认数组初始化的大小
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 空数组实例(当初始化容量=0时)
*/
private static final Object[] EMPTY_ELEMENTDATA = {
};
/**
* 调用默认构造器时,初始化的空数组实例
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
/**
* ArrayList底层存放元素使用的数组
*/
transient Object[] elementData;
/**
* 数组中存放的元素个数(注意与数组长度的区分)
*/
private int size;
三、ArrayList
类构造器
ArrayList
类中共有3个构造器:
/**
* 指定数组的初始化长度
*/
public ArrayList(int initialCapacity) {
// 主要是初始化elementData数组
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
// EMPTY_ELEMENTDATA默认的空数组实现(前面介绍了这个静态属性)
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* 默认构造器
*/
public ArrayList() {
// 表示数组未初始化(DEFAULTCAPACITY_EMPTY_ELEMENTDATA数组空实现,前面介绍过这个静态属性)
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* 复制构造器
*/
public ArrayList(Collection<