Queue、Deque和BlockingQueue的区别?
请解释Java中Queue、Deque和BlockingQueue三种队列接口的区别和层次关系。说明它们的常见实现类(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。