1. List集合深度解析
Java集合框架中的List接口是我们日常开发中最常使用的数据结构之一。不同于Set的无序性和Map的键值对结构,List以线性方式存储元素,保留了插入顺序并允许重复值。在实际项目中,ArrayList和LinkedList是最常见的两种实现。
1.1 ArrayList实现原理
ArrayList底层基于动态数组实现,其核心机制在于自动扩容。初始化时默认创建长度为10的数组,当元素数量超过当前容量时,会触发grow()方法进行1.5倍扩容(JDK8+)。这种设计在随机访问时效率极高(时间复杂度O(1)),但在中间位置插入/删除元素时需要移动后续所有元素(最坏情况O(n))。
java复制// 典型扩容代码片段
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);
}
重要实践建议:在已知最终数据量的场景下,建议通过构造函数ArrayList(int initialCapacity)指定初始容量,避免多次扩容带来的性能损耗。实测显示,初始化百万级数据时,预分配容量可减少约30%的执行时间。
1.2 LinkedList特性剖析
LinkedList采用双向链表结构,每个节点通过Node类维护前驱和后继引用。这种结构使得在头部/尾部进行增删操作仅需O(1)时间复杂度,但随机访问需要遍历链表(平均O(n/2))。其内存占用高于ArrayList,因为每个元素需要额外的两个引用空间。
java复制// 典型节点结构
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
// 构造方法.
