【java】Queue(队列)接口详解
Java Queue 接口详解:从入门到进阶(方法解析 + 易错点 + 面试重点)
在日常 Java 开发中,队列(Queue) 是一种非常常见的数据结构。
例如:
- 任务调度
- 线程池任务排队
- 消息队列
- 广度优先搜索(BFS)
- 生产者消费者模型
在 Java 中,队列并不是一个具体类,而是一个接口:
java.util.Queue
很多人学习 Queue 时直接去看实现类,例如:
LinkedListPriorityQueueArrayDequeBlockingQueue
但如果没有理解 Queue 接口本身的设计思想,很容易在实际开发和面试中出现混乱。
所以本文将从 Queue 接口本身出发,逐步深入:
- Queue 基本概念
- Queue 接口方法详解
- Queue 的两套 API 设计思想
- Queue 的进阶用法(来自父接口 Collection)
- 常见易错点
- 面试高频问题
一、什么是 Queue?
Queue(队列)是一种 先进先出(FIFO, First In First Out) 的数据结构。
可以想象成 排队买奶茶:
队列头 → [A] [B] [C] [D] ← 队列尾
↑
新元素加入尾部
规则:
- 新元素 从队尾进入
- 元素 从队头取出
例如:
入队:A → B → C
出队顺序:
A
B
C
二、Queue 在 Java 集合框架中的位置
Java 集合框架结构:
Collection
│
├── List
│
├── Set
│
└── Queue
│
├── Deque
│
├── PriorityQueue
│
└── BlockingQueue (并发包)
关键点:
Queue继承自CollectionDeque继承QueueQueue本身只是 接口
public interface Queue<E> extends Collection<E>
因此:
Queue 不仅有自己的方法,还继承了 Collection 的方法。
三、Queue 的核心方法
Queue 主要提供 6个核心方法,分为三组。
| 操作 | 抛异常 | 返回特殊值 |
|---|---|---|
| 插入 | add(e) | offer(e) |
| 删除 | remove() | poll() |
| 查看 | element() | peek() |
这是 Java Queue 设计的核心思想。
四、插入元素:add vs offer
1 add()
boolean add(E e)
作用:
向队列尾部插入元素
特点:
- 插入失败会 抛异常
示例:
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
如果队列容量满:
IllegalStateException
2 offer()
boolean offer(E e)
作用:
向队列尾部插入元素
特点:
- 插入失败 返回 false
- 不抛异常
示例:
queue.offer(10);
为什么会有两个方法?
这是 Java API 的一个设计原则:
| 方法 | 失败行为 |
|---|---|
| add | 抛异常 |
| offer | 返回 false |
在 有容量限制的队列 中区别明显,例如:
ArrayBlockingQueue
在开发中通常推荐:
优先使用 offer()
因为异常成本更高。
五、删除元素:remove vs poll
1 remove()
E remove()
作用:
删除并返回队头元素
如果队列为空:
NoSuchElementException
示例:
Integer value = queue.remove();
2 poll()
E poll()
作用:
删除并返回队头元素
如果队列为空:
返回 null
示例:
Integer value = queue.poll();
六、查看队头元素:element vs peek
1 element()
E element()
作用:
查看队头元素,但不删除
队列为空:
NoSuchElementException
2 peek()
E peek()
作用:
查看队头元素,但不删除
队列为空:
返回 null
七、Queue 六大核心方法总结
| 操作 | 抛异常版本 | 返回值版本 |
|---|---|---|
| 插入 | add(e) | offer(e) |
| 删除 | remove() | poll() |
| 查看 | element() | peek() |
记忆口诀:
add / remove / element → 异常版
offer / poll / peek → 安全版
实际开发推荐:
offer
poll
peek
八、Queue 的进阶用法(来自 Collection)
因为 Queue 继承自 Collection,所以也可以使用很多 Collection 的方法。
1 size()
获取队列长度
queue.size();
示例:
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
System.out.println(queue.size()); // 2
2 isEmpty()
判断队列是否为空
queue.isEmpty();
3 contains()
判断是否存在某个元素
queue.contains(10);
注意:
Queue 并不保证查询效率。
4 clear()
清空队列
queue.clear();
5 iterator()
遍历队列
for(Integer value : queue){
System.out.println(value);
}
或者:
Iterator<Integer> it = queue.iterator();
注意:
遍历顺序通常是 从队头到队尾
但 Queue接口并不保证顺序(某些特殊队列例外)。
九、Queue 常见使用示例
经典场景:广度优先搜索(BFS)
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
while(!queue.isEmpty()){
int node = queue.poll();
System.out.println(node);
// 假设加入子节点
queue.offer(node + 1);
queue.offer(node + 2);
}
十、Queue 常见易错点
1 LinkedList 才是常见实现
很多人以为:
Queue queue = new Queue(); ❌
实际上必须使用实现类:
Queue<Integer> queue = new LinkedList<>();
2 remove() 和 poll() 区别
很多新手写代码:
while(queue.remove() != null)
如果队列为空:
程序直接异常
正确写法:
while(!queue.isEmpty()){
queue.poll();
}
或者:
Integer value;
while((value = queue.poll()) != null){
}
3 Queue 不允许 null(大部分实现)
很多队列实现 禁止 null:
原因:
poll() 返回 null 表示队列为空
如果允许 null 就无法区分。
十一、面试常见问题
1 Queue 和 Deque 的区别
Queue:
单端队列
Deque:
双端队列
Deque 可以:
头插
尾插
头删
尾删
2 Queue 和 Stack 区别
| 数据结构 | 特点 |
|---|---|
| Queue | FIFO |
| Stack | LIFO |
3 为什么 Queue 有两套 API?
答案:
为了同时支持 异常处理方式 和 返回值处理方式
这是 Java 集合框架统一设计:
add / remove / element
offer / poll / peek
4 Java 中常见 Queue 实现
(简单了解)
LinkedListPriorityQueueArrayDequeBlockingQueue
十二、总结
Queue 是 Java 集合框架中非常重要的接口,其核心思想是:
FIFO(先进先出)
需要重点掌握:
1️⃣ Queue 六大核心方法
add / offer
remove / poll
element / peek
2️⃣ 推荐使用的安全方法
offer
poll
peek
3️⃣ Queue 继承 Collection
可以使用:
size
isEmpty
contains
iterator
4️⃣ 常见面试问题
- Queue vs Deque
- Queue vs Stack
- 为什么有两套 API
- remove 与 poll 区别
更多推荐



所有评论(0)