ArrayList底层原理
摘要:要理解
ArrayList的底层原理,我们可以从 Java 源码的核心实现入手。ArrayList本质上是动态数组的实现,它通过对底层数组进行扩容和缩容操作,实现了大小可变的集合功能。以下结合 JDK 源码(基于 JDK 8)详细解析
一、类的定义与核心属性
首先看 ArrayList 的类定义和核心成员变量,这是理解其底层的基础:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
// 序列化版本号
private static final long serialVersionUID = 8683452581122892189L;
// 默认初始容量(无参构造器使用)
private static final int DEFAULT_CAPACITY = 10;
// 空数组(用于空实例)
private static final Object[] EMPTY_ELEMENTDATA = {
};
// 默认空数组(无参构造器初始化时使用,与上面的区别是首次添加元素时会扩容到10)
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
// 底层核心数组:存储ArrayList的元素(transient修饰表示不参与默认序列化)
transient Object[] elementData;
// 实际元素数量(size != elementData.length,因为可能有未使用的容量)
private int size;
}
核心属性解析:
elementData:底层真正存储元素的数组(Object类型,支持泛型)。size:当前集合中元素的实际数量(不是数组长度)。DEFAULT_CAPACITY:无参构造器首次添加元素时的默认容量(10)。- 两个空数组的区别:
DEFAULTCAPACITY_EMPTY_ELEMENTDATA用于无参构造,首次添加元素时会扩容到10;EMPTY_ELEMENTDATA用于指定初始容量为0的构造器。
二、构造方法:初始化底层数组
ArrayList 有三个核心构造方法,决定了底层数组的初始状态:
1. 无参构造器
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
- 初始化时将
elementData指向默认空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA。 - 延迟初始化:此时数组长度为0,首次添加元素时才会扩容到默认容量10(避免初始化为10但不使用的内存浪费)。
2. 指定初始容量的构造器
public ArrayList(int initialCapacity

最低0.47元/天 解锁文章
1709

被折叠的 条评论
为什么被折叠?



