一、ArrayList结构
1 属性
2 构造器
3 方法
二、原理概述
1.ArrayList中维护了一个Object类型的数组elementData
2.new ArrayList()时
- 如果使用的是无参构造器,则初始elementData容量为0,是一个空数组;当第一次添加元素的时候,才会第一次扩容为10(静态常量),如需要再次扩容时,则扩容elementData为1.5倍,变成 1.5 * 10
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则扩容elementData为1.5倍,变成 1.5 * 初始化大小
三、相关代码解读
1 add()
public boolean add(E e) {
// 先校验elementData数组是否需要扩容
// 是--->对数组进行扩容;否---->无需扩容
ensureCapacityInternal(size + 1);
// 添加元素
elementData[size++] = e;
//返回true
return true;
}
2 grow()
private void grow(int minCapacity) {
// oldCapacity = 当前数组长度
int oldCapacity = elementData.length;
// newCapacity = 原数组长度 + 1/2 * 原数组长度
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 数组拷贝
elementData = Arrays.copyOf(elementData, newCapacity);
}