Queue.peek() 返回当前队首元素(即下一个待处理任务),不移除、不改变队列状态;空队列返回null,PriorityQueue按优先级而非插入顺序确定队首。

Queue.peek() 的作用就是查看队首元素而不移除它,但要注意:它返回的是“当前队首”,不是“下一个待处理任务”——因为队首就是下一个待处理任务。
理解 peek() 的实际行为
在标准队列(如 LinkedList、PriorityQueue)中,peek() 返回的是队列头部的元素,也就是按顺序即将被 poll() 取出的那个任务。它不会修改队列长度、顺序或内部状态。
例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
Queue<String> queue = new LinkedList<>();
queue.offer("task-1");
queue.offer("task-2");
queue.offer("task-3");
System.out.println(queue.peek()); // 输出 "task-1"
System.out.println(queue.size()); // 仍是 3
System.out.println(queue.peek()); // 再次调用,还是 "task-1"
常见误区与注意事项
-
peek() 不等于 “看下一个”:如果已调用过
poll(),队首自然更新;peek()永远只看当前队首,不是“历史下一个”或“预测下一个”。 -
空队列返回 null:对空队列调用
peek()返回null,需判空避免 NPE。 - PriorityQueue 的“队首”由优先级决定:不是插入顺序最前的,而是优先级最高(或最小,取决于比较器)的那个任务。
安全预览的推荐写法
为避免空指针和逻辑混淆,建议封装一层检查:
立即学习“Java免费学习笔记(深入)”;
public static <T> Optional<T> peekSafe(Queue<T> queue) {
return Optional.ofNullable(queue.peek());
}
// 使用示例
peekSafe(queue).ifPresent(task -> System.out.println("下一个任务是:" + task));
如果真想预览“未来队首”(非标准需求)
标准 Queue 接口不支持跳过当前队首看后续元素。若业务需要预览第 2 个任务,只能:
- 临时
poll()当前队首 → 记录新队首 → 再把原队首offer()回去(仅适用于允许重入且无并发的场景); - 改用
Deque并遍历,或使用带索引的结构(如ArrayList)配合自定义队列逻辑; - 更稳妥的方式:用
Iterator获取前几个元素(注意部分实现不保证迭代顺序与出队顺序一致)。

















