ArrayList查询、修改快,LinkedList头尾增删快;查询和修改ArrayList全面占优,增删位置决定性能优劣,实际选型需依核心操作模式而定。

ArrayList 和 LinkedList 虽然都实现 List 接口,但底层结构完全不同,导致增删改查行为差异明显。选错集合类型,小项目可能无感,高并发或大数据量场景下性能会断崖式下降。
查询(get):ArrayList 稳压 LinkedList
ArrayList 基于数组,支持 O(1) 随机访问:给定索引,直接计算内存地址取值。LinkedList 是双向链表,必须从头或尾开始遍历查找——源码中做了优化:索引在前半段就从前遍历,后半段则从后遍历,但仍是 O(n/2) ≈ O(n)。实测中,查中间元素时 ArrayList 通常快 5–10 倍。
插入(add):位置决定胜负
插入性能高度依赖位置:
- 头部插入:LinkedList 占优。只需新建节点、修改 first 引用和原首节点的 prev,O(1);ArrayList 需整体后移所有元素,O(n)
- 尾部插入:两者接近。ArrayList 尾插是 O(1) 均摊复杂度(扩容时为 O(n),但不频繁);LinkedList 尾插也是 O(1)(更新 last 引用)
- 中间插入(如 index=500):LinkedList 仍占优。无需移动数据,只改前后指针;ArrayList 需移动后续全部元素,代价高昂
删除(remove):逻辑同插入,但更易被忽略细节
删除同样看位置:
- 按索引删除:LinkedList 查找 + 解链 = O(n) + O(1);ArrayList 查找 + 移动 = O(1) + O(n) → 总体 LinkedList 更快
- 按对象删除(remove(Object)):两者都要遍历比较。ArrayList 遍历快(CPU 缓存友好),LinkedList 遍历慢(内存不连续),此时 ArrayList 反而可能更快
- 删除首/尾元素:LinkedList 是 O(1);ArrayList 删除首元素是 O(n),删尾是 O(1)
修改(set):ArrayList 全面领先
set 操作本质是定位后赋值。ArrayList 直接索引定位 + 覆盖,O(1);LinkedList 必须先 node(index) 遍历找到节点,再改 item,O(n)。没有例外场景,只要涉及按索引更新,ArrayList 是唯一合理选择。
实际选型不能只看“理论上哪个快”,而要看你的核心操作模式:读多写少 → ArrayList;高频头/尾/中间增删且读少 → LinkedList;纯队列/栈语义(offer/poll/peek)→ 还可考虑 ArrayDeque,它比 LinkedList 更快更省内存。


















