目录
1. 基本概述与对比
1.1 整体对比
特性 | ArrayList | LinkedList |
---|---|---|
底层实现 | 动态数组 | 双向链表 |
随机访问 | O(1) | O(n) |
插入删除 | O(n) | O(1) |
内存占用 | 连续内存空间 | 零散内存空间 |
默认容量 | 10 | 无初始容量 |
1.2 数据结构示意图
ArrayList结构:
┌─────┬─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │
└─────┴─────┴─────┴─────┴─────┘
LinkedList结构:
┌───┐ ┌───┐ ┌───┐
│ 1 │<-->│ 2 │<-->│ 3 │
└───┘ └───┘ └───┘
2. ArrayList详解
2.1 核心属性
public class ArrayList<E> extends AbstractList<E> {
// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;
// 存储元素的数组
transient Object[] elementData;
// 实际元素数量
private int size;
// 用于空实例的共享空数组
private static final Object[] EMPTY_ELEMENTDATA = {
};
// 用于默认大小的空实例的共享数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
}
2.2 动态扩容机制
ArrayList最关键的特性是动态扩容。当数组空间不足时,会创建更大的数组并复制元素。
private void grow(int minCapacity) {
// 获取旧容量
int oldCapacity = elementData.length;
// 新容量 = 旧容量 + 旧容量/2 (增加50%)
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);