选 ArrayList 还是 LinkedList 关键看操作类型:ArrayList 基于动态数组,随机访问 O(1),适合读多写少;LinkedList 基于双向链表,插入删除 O(1)(已知位置),适合写多读少;内存上 ArrayList 更紧凑,LinkedList 每节点多两个指针。

选 ArrayList 还是 LinkedList,关键看你的主要操作类型和数据访问模式,不是凭感觉或口诀。两者性能差异根植于底层结构:ArrayList 是动态数组,LinkedList 是双向链表。下面从三个最常踩坑的维度帮你理清选择逻辑。
看随机访问多不多
如果你经常用 get(i)、set(i, x) 或遍历中按索引取值(比如 for (int i = 0; i ),ArrayList 是明确首选。
- ArrayList:直接通过内存偏移计算地址,O(1),百万级元素下毫秒级响应
- LinkedList:必须从头或尾开始遍历,平均要走一半链表,O(n);哪怕只查第 50 万个元素,也要跳转数十万次指针,实际耗时可能是 ArrayList 的几十倍
看增删集中在哪一段
“增删快”不等于“ anywhere 都快”——LinkedList 的优势只在已知位置前提下的指针调整,而“找到位置”本身就要花时间。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 头部操作(addFirst / removeFirst):LinkedList 稳定 O(1);ArrayList 要整体后移/前移所有元素,O(n),代价极高
- 尾部操作(add / removeLast):两者都是 O(1)(ArrayList 均摊,扩容瞬时 O(n)但极少发生);但 ArrayList 内存更紧凑,缓存友好,真实性能通常略优
- 中间插入/删除(add(index, x)):两者都是 O(n) —— ArrayList 移动元素,LinkedList 先遍历再改指针;实测中 ArrayList 往往更快,因连续内存访问比链表跳转更高效
看内存和场景是否特殊
别忽略空间成本和接口能力。它们不只是“List”,还暴露不同语义:
- ArrayList 占用更少内存:每个元素只存数据;LinkedList 每个节点额外存两个引用(prev/next),内存开销高约 30%~50%
- LinkedList 实现了
Deque接口,天然支持offerFirst()、pollLast()等双端队列操作;若你正写栈、队列或 LRU 缓存,它语义更贴切 - 绝大多数业务场景(如用户列表、订单集合、配置项缓存)以查询+尾部追加为主,ArrayList 更合适;只有明确需要高频头插/头删(如实时消息队列头部优先处理),才考虑 LinkedList










