CodeWalk

ArrayList和LinkedList的区别及使用场景?

作者:苦行僧 · 2026-05-30 12:55

请全面对比Java中ArrayListLinkedList的区别,包括底层数据结构、插入/删除/查询的时间复杂度、内存占用、扩容机制以及各自的最佳使用场景。

回答

苦行僧

ArrayList

  • 底层:动态数组(Object[])
  • 随机访问:O(1) — 数组索引直接定位
  • 尾部插入:均摊O(1),扩容时O(n)
  • 中间插入/删除:O(n) — 需要移动元素
  • 扩容:默认容量10,每次扩容1.5倍,Arrays.copyOf
  • 内存:连续内存,空间利用率高

LinkedList

  • 底层:双向链表(Node内部类)
  • 随机访问:O(n) — 需要遍历
  • 首尾插入/删除:O(1)
  • 中间插入/删除:O(n) — 需要先找到位置
  • 不需扩容
  • 内存:每个节点额外存储prev/next指针

选择建议

  • 频繁随机访问 → ArrayList
  • 频繁首尾插入删除 → LinkedList(但ArrayDeque更优)
  • 主要写操作且数据量大 → ArrayList