1. ArrayList 核心机制解析
ArrayList作为Java集合框架中最常用的动态数组实现,其底层设计融合了数组的高效访问和动态扩容的灵活性。理解它的工作机制对于写出高性能Java代码至关重要。
1.1 存储结构与基础属性
ArrayList内部维护着一个Object数组elementData,这是所有元素的存储容器。关键字段包括:
- DEFAULT_CAPACITY:默认初始容量10
- size:当前实际元素数量(非数组长度)
- modCount:结构性修改计数器(用于快速失败机制)
java复制// JDK源码片段
transient Object[] elementData;
private int size;
protected transient int modCount = 0;
数组与size的关系常被误解:elementData.length是容器容量,size是实际元素个数。比如new ArrayList(20)创建后,size=0而elementData.length=20。
1.2 动态扩容算法剖析
当添加元素导致size+1 > elementData.length时触发扩容:
- 计算新容量 = 旧容量 + (旧容量 >> 1)(即1.5倍)
- 创建新数组并拷贝数据(Arrays.copyOf)
- 旧数组被GC回收
java复制// 扩容核心代码(JDK17)
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(
oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth
