行业知识
探秘ArrayList源码:Java动态数组的背后实现
2026-10-29 03:18:34
来源:互联网转载
探秘ArrayList源码:Java动态数组的背后实现
- 一、成员变量
- 二、构造器
- 1、默认构造器
- 2、带初始容量参数构造器
- 3、指定collection元素参数构造器
- 三、add()方法扩容机制
- 四、场景分析
- 1、对于ensureExplicitCapacity()方法
- 1.1 add 进第 1 个元素到 ArrayList 时
- 1.2 当 add 第 2 个元素时
- 1.3 直到添加第 11 个元素
- 2、对于grow() 方法:
- 2.1 当 add 第 1 个元素时
- 2.2 当 add 第 11 个元素进入 grow 方法时
- 五、心得体会
- ��、源码简易流程图
一、成员变量
读者需先对源码的成员变量阅览一遍,看个眼熟,有助于后面源码的理解
private static final long serialVersionUID = 8683452581122892189L; /** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; /** * 空数组(用于空实例)。 */ private static final Object[] EMPTY_ELEMENTDATA = {}; //用于默认大小空实例的共享空数组实例。 //我们把它从EMPTY_ELEMENTDATA数组中区分出来,以知道在添加第一个元素时容量需要增加多少。 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * 存储ArrayList元素的数组缓冲区 */ transient Object[] elementData; /** * ArrayList 所包含的元素个数 */ private int size;二、构造器
1、默认构造器
/** *默认构造函数,使用初始容量10构造一个空列表(无参数构造) */public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}以无参数构造方法创建 ArrayList时,实际上初始化赋值的是一个空数组。此时并没有为它创建对象,当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。
2、带初始容量参数构造器
/** * 带初始容量参数的构造函数。(用户自己指定容量) */public ArrayList(int initialCapacity) { if (initialCapacity > 0) {//初始容量大于0 //创建initialCapacity大小的数组 this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) {//初始容量等于0 //创建空数组 this.elementData = EMPTY_ELEMENTDATA; } else {//初始容量小于0,抛出异常 throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); }}3、指定collection元素参数构造器
/***构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回*如果指定的集合为null,throws NullPointerException。*/ public ArrayList(Collection