
一、List 集合核心特性补充关键细节原文提到 List 的 “有序、可重复、支持索引”这里补充有序性指「插入顺序」与「存储顺序」一致而非 “排序”排序需手动调用Collections.sort()可重复性允许存储equals()返回true的元素如两个new String(Java)索引访问索引从 0 开始越界会抛出IndexOutOfBoundsException开发中需注意校验。二、ArrayList 深度解析补充底层原理1. 底层动态数组的核心机制ArrayList 基于动态扩容数组实现核心参数DEFAULT_CAPACITY默认初始容量10elementData存储元素的数组transient 修饰避免序列化空元素size实际元素个数≠ 数组长度。扩容逻辑面试高频当添加元素时若数组已满size elementData.length触发扩容扩容公式newCapacity oldCapacity (oldCapacity 1)即扩容 1.5 倍扩容时会创建新数组复制原数组元素Arrays.copyOf()因此频繁扩容会降低性能。优化建议若已知元素数量创建 ArrayList 时指定初始容量避免扩容java运行// 已知要存1000个元素指定初始容量避免多次扩容 ArrayListString list new ArrayList(1000);2. 增删效率低的本质原因查询快直接通过索引定位数组元素elementData[index]时间复杂度 O (1)增删慢新增 / 删除非尾部元素时需移动后续元素如在索引 0 插入需移动所有元素时间复杂度 O (n)示例list.add(0, A)→ 数组中索引 0 后的元素全部后移一位。3. 易错点遍历删除元素ArrayList 遍历删除时直接用for循环会触发ConcurrentModificationException正确写法java运行ArrayListString list new ArrayList(); list.add(A); list.add(B); list.add(C); // 错误写法for循环删除 → 抛ConcurrentModificationException // for (int i 0; i list.size(); i) { // if (list.get(i).equals(B)) { // list.remove(i); // } // } // 正确写法1迭代器删除 IteratorString it list.iterator(); while (it.hasNext()) { String elem it.next(); if (elem.equals(B)) { it.remove(); // 迭代器的remove方法不会触发异常 } } // 正确写法2Java 8 removeIf list.removeIf(elem - elem.equals(B));三、LinkedList 深度解析补充底层原理1. 双向链表的核心结构LinkedList 基于双向链表实现每个节点Node包含java运行private static class NodeE { E item; // 节点值 NodeE next; // 后继节点 NodeE prev; // 前驱节点 Node(NodeE prev, E element, NodeE next) { this.item element; this.next next; this.prev prev; } }链表头部first和尾部last有指针因此操作首尾元素效率极高O (1)访问中间元素时需从头部 / 尾部开始遍历根据索引距离首尾的远近选择遍历方向时间复杂度 O (n)。2. 作为队列 / 栈的实战用法LinkedList 实现了Deque接口可直接作为队列FIFO、栈LIFO使用java运行// 1. 作为队列先进先出 DequeString queue new LinkedList(); queue.offer(A); // 入队 queue.offer(B); System.out.println(queue.poll()); // 出队A System.out.println(queue.peek()); // 查看队首B // 2. 作为栈后进先出 DequeString stack new LinkedList(); stack.push(A); // 入栈 stack.push(B); System.out.println(stack.pop()); // 出栈B System.out.println(stack.peek()); // 查看栈顶A3. 性能误区索引访问很多开发者误以为 LinkedList 也适合索引访问实际效率极低java运行LinkedListInteger list new LinkedList(); for (int i 0; i 100000; i) { list.add(i); } // 耗时极长需遍历链表找到索引99999的元素 long start System.currentTimeMillis(); int num list.get(99999); long end System.currentTimeMillis(); System.out.println(耗时 (end - start) ms); // 约几十msArrayList仅需0ms四、Vector 深度解析补充替代方案1. 线程安全的实现方式Vector 的线程安全是通过给所有方法加 synchronized 关键字实现的java运行// Vector的add方法源码 public synchronized boolean add(E e) { modCount; ensureCapacityHelper(elementCount 1); elementData[elementCount] e; return true; }缺点方法级同步导致并发效率极低即使多个线程操作不同元素也会互斥对比CopyOnWriteArrayList采用 “写时复制” 策略读操作无锁写操作复制新数组并发效率更高。2. 现代替代方案实战推荐表格场景推荐方案优势单线程 大量查询ArrayList效率最高单线程 大量增删LinkedList增删效率高多线程 读多写少CopyOnWriteArrayList读无锁写复制并发效率高多线程 读写均衡Collections.synchronizedList(new ArrayList())通用线程安全包装CopyOnWriteArrayList 示例java运行import java.util.concurrent.CopyOnWriteArrayList; public class CopyOnWriteDemo { public static void main(String[] args) { CopyOnWriteArrayListString list new CopyOnWriteArrayList(); // 多线程添加元素 Runnable task () - { for (int i 0; i 3; i) { list.add(Thread.currentThread().getName() - i); } }; Thread t1 new Thread(task, 线程1); Thread t2 new Thread(task, 线程2); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 遍历输出无需加锁 for (String elem : list) { System.out.println(elem); } } }五、三大实现类对比补充性能维度原文的对比表格已清晰这里补充性能细节和选型决策树1. 增强版对比表格表格特性ArrayListLinkedListVector底层结构动态数组双向链表动态数组线程安全非线程安全非线程安全线程安全方法级同步查询效率O (1)随机访问O (n)遍历O (1)但同步开销大增删效率O (n)移动元素O (1)首尾/ O (n)中间O (n)移动 同步开销扩容机制1.5 倍扩容无需扩容链表节点动态创建2 倍扩容默认内存占用连续内存有冗余空间离散内存每个节点多存指针连续内存冗余空间更大迭代器fail-fast快速失败fail-fastfail-fast推荐使用场景单线程、查询多、增删少单线程、增删多首尾几乎不用现代替代方案--CopyOnWriteArrayList2. 选型决策树实战快速选择预览查看代码是是否否查询多/增删少增删多首尾增删多中间选择List实现类是否多线程环境读多写少CopyOnWriteArrayListCollections.synchronizedList操作类型ArrayListLinkedListArrayListflowchart TD A[选择List实现类] -- B{是否多线程环境} B --|是| C{读多写少} C --|是| D[CopyOnWriteArrayList] C --|否| E[Collections.synchronizedList] B --|否| F{操作类型} F --|查询多/增删少| G[ArrayList] F --|增删多首尾| H[LinkedList] F --|增删多中间| I[ArrayList]是是否否查询多/增删少增删多首尾增删多中间选择List实现类是否多线程环境读多写少CopyOnWriteArrayListCollections.synchronizedList操作类型ArrayListLinkedListArrayList豆包你的 AI 助手助力每日工作学习六、实战最佳实践补充开发规范优先使用 ArrayList日常开发中查询场景远多于增删ArrayList 是默认选择指定初始容量创建 ArrayList 时若已知元素数量务必指定初始容量避免扩容避免索引访问 LinkedListLinkedList 仅适合首尾增删中间操作优先用 ArrayList遍历删除用迭代器 /removeIf避免ConcurrentModificationException多线程场景避免 Vector优先用CopyOnWriteArrayList或同步包装器泛型必须指定避免原始类型如ArrayList防止类型转换异常。总结ArrayList动态数组实现查询快、增删慢单线程查询场景首选创建时指定初始容量可优化性能LinkedList双向链表实现首尾增删快、查询慢仅适用于单线程首尾频繁操作的场景Vector古老的线程安全数组效率极低现代开发中已被CopyOnWriteArrayList替代选型核心单线程看操作类型查询 / 增删多线程看读写比例读多写少用 CopyOnWriteArrayList。