JJava 知识库
JAVA INTERVIEW

高频面试题

Java集合基础约 2 分钟

批量处理订单时既有大量遍历又有中间插入,你会选 ArrayList 还是 LinkedList?为什么?

参考回答约 2 分钟 · 口语表达
我的判断

这种订单批处理我通常仍选 ArrayList;遍历是主操作,而 LinkedList 的节点分配和缓存不友好,理论上的中间 O(1) 插入很少真正成立。

要先问“中间插入”是怎么找到位置的。如果每次按下标找第 N 个元素,LinkedList 光定位就要 O(n),随后虽然改指针快,整体仍然慢;而订单批处理通常大量顺序遍历,ArrayList 连续存储、CPU cache 友好,实际性能更稳定。

我会选 ArrayList,并尽量改变算法而不是换容器:先收集新增项,最后一次合并或排序;删除用 removeIf 或写入新列表;已知数量时预设容量。这样避免在大列表中反复搬移。

LinkedList 只有在已经持有节点位置、频繁做两端操作等少数场景才可能有价值。做队列或栈我也更常用 ArrayDeque,它没有每个节点的对象开销。

最终会用接近真实订单量和插入比例做 JMH 或链路压测,因为“数组插入 O(n)、链表 O(1)”这个结论忽略了定位、分配和缓存命中。