一、简介
ArrayList
是 Java 集合框架中最常用的 动态数组实现类,实现了 List
接口,允许存储 有序、可重复 的元素。
- 支持随机访问,访问时间复杂度为
O(1)
- 插入/删除非尾部元素需移动数据,时间复杂度为
O(n)
- 非线程安全,需手动处理并发问题
二、底层结构
核心成员变量:
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size;
|
- 元素存储在
Object[]
中
- 所有元素按顺序排列,支持下标访问
三、初始化与扩容机制
1. 初始化容量
- 使用无参构造时,并不会立刻分配内存
- 懒加载机制:第一次添加元素时初始化容量为 10
2. ensureCapacityInternal
:确保容量
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
|
3. ensureExplicitCapacity
:触发扩容判断
private void ensureExplicitCapacity(int minCapacity) { modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); }
|
4. grow
:核心扩容逻辑
private void grow(int minCapacity) { int oldCapacity = elementData.length; 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); }
|
5. hugeCapacity
:极限处理
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
|
四、常用方法源码解析
1. add(int index, E e)
:添加元素
public void add(int index, E element) { rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
|
2. get(int index)
:获取元素
public E get(int index) { rangeCheck(index); return (E) elementData[index]; }
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
|
3. remove(int index)
:删除元素
public E remove(int index) { rangeCheck(index); E oldValue = (E) elementData[index]; int numMoved = size - index - 1;
if (numMoved > 0) { System.arraycopy(elementData, index + 1, elementData, index, numMoved); }
elementData[--size] = null; return oldValue; }
|
五、总结
特性 |
说明 |
存储结构 |
动态数组 Object[] |
初始容量 |
默认 10(懒加载) |
扩容机制 |
原容量 * 1.5 |
插入/删除效率 |
尾部快,中间慢 |
线程安全 |
非线程安全,需自行加锁或使用并发集合 |
适用场景