1. List集合基础与核心特性解析
Java集合框架中的List接口是最常用的数据结构之一,它代表一个有序的元素序列。与数组不同,List的长度是可变的,这在实际开发中提供了极大的灵活性。ArrayList和LinkedList是List接口的两个经典实现类,它们各自有着不同的底层实现和适用场景。
ArrayList基于动态数组实现,内部使用Object[]数组存储元素。当添加元素导致容量不足时,会自动扩容为原来的1.5倍(JDK1.8)。这种实现使得ArrayList在随机访问时性能极佳(时间复杂度O(1)),但在中间位置插入或删除元素时需要移动后续所有元素(时间复杂度O(n))。因此,ArrayList特别适合读多写少的场景。
java复制// ArrayList扩容核心代码片段(java.util.ArrayList)
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍扩容
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedList采用双向链表实现,每个节点(Node)包含前驱指针、后继指针和元素值。这种结构使得LinkedList在任意位置插入和删除元素都非常高效(时间复杂度O(1)),但随机访问需要从头或尾遍历链表(时间复杂度O(n))。LinkedList还实现了Deque接口,可以作为双端队列使用。
实际开发中选择ArrayList还是LinkedList,关键看操作类型比例。统计显示,80%以上的场景更适合ArrayList,因为现代CPU缓存对数组连续内存访问更友好。只有在频繁在列表中间增删元素时,LinkedList才有明显优势。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. List核心API与性能优化实践
2.1 关键操作方法对比
List接口提供了丰富的操作方法,但不同实现的性能特征差异显著:
| 操作 | ArrayList时间复杂度 | LinkedList时间复杂度 |
|---|---|---|
| get(int) | O(1) | O(n) |
| add(E) | 均摊O(1) | O(1) |
