优先选 ArrayDeque 而非 LinkedList 实现队列,因其无节点封装开销、缓存友好、内存占用低(10 万 Integer 约 1–1.5 MB vs 5–7 MB),且 JDK 官方推荐为最高效实现。

用 LinkedList 实现自定义队列是可行的,但不推荐用于高性能或内存敏感场景;它和 ArrayDeque 的核心差异不在“能不能用”,而在**节点封装开销 vs 连续数组缓存友好性**。
用 LinkedList 手动实现 Queue 接口
LinkedList 本身已实现 Queue,但若需自定义行为(如带容量限制、日志记录、空值拦截),可包装它:
- 继承
LinkedList并重写offer()、poll()、peek()等方法,加入校验或统计逻辑 - 更推荐组合方式:持有一个
private final LinkedList,在委托方法前后插入自定义逻辑delegate = new LinkedList(); - 注意:不要直接暴露
addFirst()/addLast()等双向操作,否则破坏队列 FIFO 语义
内存开销对比:LinkedList 的隐藏成本
每插入一个元素,LinkedList 都要创建一个独立的 Node 对象:
- 每个
Node至少含 3 个字段:E item+Node+next Node(64 位 JVM 下,对象头 12 字节 + 对齐填充,通常占 24–32 字节)prev - 加上引用本身(8 字节)、数据字段(如
Integer是 16 字节对象,非原生 int),单个元素实际内存占用常达 40–64 字节 - 节点在堆中随机分布,CPU 缓存命中率低,频繁遍历或批量出队时性能下降明显
ArrayDeque 的内存优势
ArrayDeque 底层是循环数组,无额外节点对象:
- 只维护一个
Object[] elements数组 + 两个索引(head,tail),无 per-element 开销 - 元素直接存入数组,紧凑连续;小对象(如
Integer)虽仍为对象引用,但引用本身仅 8 字节,数组头开销均摊后极小 - 初始容量 16,扩容按 2 倍增长(如 16→32→64),空间利用率高;即使有 25% 空闲,总内存也远低于等量
LinkedList节点 - 实测:存 10 万个
Integer,LinkedList堆占用约 5–7 MB,ArrayDeque约 1–1.5 MB(含数组扩容余量)
选型建议
除非你明确需要链表的 O(1) 中间插入/删除(队列不需要),否则优先选 ArrayDeque:
-
ArrayDeque是 JDK 官方推荐的 Queue 实现(文档明确说明:“most efficient”) - 它线程不安全,但比
LinkedList更轻量;如需线程安全,用ConcurrentLinkedQueue(无锁链表)或LinkedBlockingQueue(带锁+链表),而非同步LinkedList - 自定义逻辑尽量通过装饰器(Decorator)模式叠加,避免继承
LinkedList引入不必要的双向能力










