1. ArrayDeque 与 LinkedList 作为队列的性能对比
ArrayDeque 与 LinkedList 作为队列的性能如何对比?
- ArrayDeque 循环数组实现
- LinkedList 链表实现
- 时间复杂度与内存开销
ArrayDeque 基于循环数组(resizable array)实现,头尾操作(addFirst/addLast/removeFirst/removeLast)都是 O(1) 且局部性好、内存紧凑;LinkedList 基于双向链表实现,头尾操作也是 O(1),但每个节点含对象头与前后指针,内存开销大、局部性差、缓存不友好。作为队列(FIFO),ArrayDeque 通常性能优于 LinkedList:更少内存分配、更小 GC 压力、缓存友好。LinkedList 的额外能力是作为 List(支持索引访问,但 O(n))与 Deque。ArrayDeque 不允许 null(LinkedList 允许)。队列/栈场景推荐 ArrayDeque,LinkedList 适合需要 List 语义或频繁中间插入的场景。
两者头尾操作都是 O(1),但 ArrayDeque 的数组布局更缓存友好、内存紧凑,性能通常更好;LinkedList 的节点指针开销大。业务队列优先 ArrayDeque。
Deque<String> queue = new ArrayDeque<>(); // 推荐队列
queue.addLast("a"); queue.addLast("b");
queue.removeFirst(); // FIFO
Deque<String> linked = new LinkedList<>(); // 链表,内存开销大