做网站服务器系统,qq代挂主站网站建设,企业品牌网站源码,企业网站推广技巧和方法#x1f680; Java 中的 ArrayList 和 LinkedList 区别详解#xff08;源码级理解#xff09;
在日常 Java 开发中#xff0c;ArrayList 和 LinkedList 是我们经常用到的两种 List 实现。虽然它们都实现了 List 接口#xff0c;但在底层结构、访问效率、插入/删除操作、扩… Java 中的 ArrayList 和 LinkedList 区别详解源码级理解
在日常 Java 开发中ArrayList 和 LinkedList 是我们经常用到的两种 List 实现。虽然它们都实现了 List 接口但在底层结构、访问效率、插入/删除操作、扩容机制等方面差异明显。
本文从实际源码出发结合内存结构与操作成本详细分析二者的异同帮助你更合理地做出选型。1. ArrayList —— 基于数组的动态列表
✅ 底层结构
ArrayList 的底层是一个 动态对象数组 Object[] elementData内存中是 连续存储元素个数由 size 字段控制和数组容量 (elementData.length) 分开管理
transient Object[] elementData; // 存储元素的数组
private int size; // 实际元素个数访问性能
由于数组结构内存连续可以通过 起始地址 下标 × 元素大小 直接定位访问效率为 O(1)非常快添加元素的逻辑默认容量为 10首次添加时触发初始化如果容量不足会执行 扩容grow操作
扩容策略原容量的 1.5 倍核心操作是新建数组 拷贝旧数据System.arraycopyint newCapacity oldCapacity (oldCapacity 1);
System.arraycopy(elementData, 0, newArray, 0, size);删除元素的逻辑
如果删除的是中间位置需要将后面的元素全部 前移一位删除最后一个元素后会将该位置置为 null防止内存泄露
System.arraycopy(elementData, index 1, elementData, index, size - index - 1);
elementData[--size] null;❌ 不会自动缩容避免频繁扩容/缩容带来的性能波动可以手动 trimToSize()⚠️ ArrayList 的缺点
插入/删除中间元素时会频繁移动数组效率低O(n)扩容需要申请新数组并复制性能有开销2. LinkedList —— 基于双向链表的列表结构
✅ 底层结构
LinkedList 是典型的 双向链表每个节点是一个 Node 对象包含 prev, next, item元素在内存中 不连续存储
private static class NodeE {E item;NodeE next;NodeE prev;
}插入/删除性能优势
插入/删除某个位置时只需修改相邻节点的指针效率高❌ 不需要扩容也不会拷贝数组访问性能劣势
链表无法通过下标快速定位元素访问第 n 个元素需要从头或尾遍历O(n)⚠️ LinkedList 的缺点
每个元素多占用 2 个引用prev 和 next访问性能差尤其在需要频繁随机读取场景下ArrayList 与 LinkedList 对比总结特性ArrayList动态数组LinkedList双向链表底层结构连续 Object[] 数组不连续的 Node 链表访问速度快O(1) 随机访问慢需要遍历O(n)插入删除慢需要移动数组元素快仅需改指针扩容机制支持扩容为 1.5 倍无需扩容内存使用少只存数据多每节点多两个引用应用场景读多写少随机访问场景写多读少插入删除频繁场景
✅ 最佳实践建议
读多写少、频繁按下标访问 ➤ 用 ArrayList写多读少、频繁插入/删除中间元素 ➤ 用 LinkedList如果你在处理的是“队列”或“栈”场景 ➤ 也可以考虑 Deque 或 ArrayDeque总结
理解 ArrayList 和 LinkedList 的底层结构能帮助你在性能、内存、复杂度方面做出更合理的设计选择。切记不要被接口迷惑底层结构决定一切。