CodeWalk

Queue、Deque和BlockingQueue的区别?

作者:小字辈 · 2026-05-30 12:55

请解释Java中QueueDequeBlockingQueue三种队列接口的区别和层次关系。说明它们的常见实现类(LinkedList、ArrayDeque、PriorityQueue、ArrayBlockingQueue等)及各自适用场景。

回答

小字辈

Queue(队列):先进先出(FIFO),主要方法:

  • 抛出异常:add()、remove()、element()
  • 返回特殊值:offer()、poll()、peek()

Deque(双端队列):继承Queue,支持两端插入/删除。

  • 实现类:ArrayDeque(数组实现,性能优于LinkedList)、LinkedList
  • 可用作队列(FIFO)或栈(LIFO)

BlockingQueue(阻塞队列):继承Queue,支持阻塞操作。

  • put():队列满时阻塞
  • take():队列空时阻塞
  • 实现类:
    • ArrayBlockingQueue(有界数组)
    • LinkedBlockingQueue(可选有界链表)
    • PriorityBlockingQueue(优先级排序)
    • SynchronousQueue(不存储元素,直接传递)
    • DelayQueue(延迟执行)

选择建议:普通队列用ArrayDeque;需要优先级用PriorityQueue;多线程生产者-消费者用BlockingQueue。