ArrayDeque和LinkedList作为队列谁更优?
请对比ArrayDeque和LinkedList作为队列/双端队列使用时的性能差异,包括底层数据结构、内存访问局部性、CPU缓存友好性、以及官方推荐。为什么Java文档推荐用ArrayDeque?
回答
编译有声
ArrayDeque:
- 底层:动态循环数组(Object[])
- 内存:连续内存,CPU缓存友好(缓存行预取)
- 首尾插入/删除:O(1),均摊几乎无开销
- 没有链表节点额外开销(prev/next指针)
- 不需要分配每个元素独立的Node对象
- 默认容量8,扩容为2倍
LinkedList:
- 底层:双向链表
- 内存:非连续,每个节点独立分配(Node对象+prev/next+item)
- CPU缓存不友好(节点分散在堆中)
- 更高的内存开销(约3倍于ArrayDeque)
- 创建和GC压力更大
官方推荐:Java文档明确推荐当需要队列或双端队列时优先使用ArrayDeque,它比LinkedList更快、内存占用更少。
例外:如果需要频繁在队列中间插入/删除,或用LinkedList同时作为List和Deque时,才考虑LinkedList。