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

Queue.peek() 的作用就是查看队首元素而不移除它,但要注意:它返回的是“当前队首”,不是“下一个待处理任务”——因为队首就是下一个待处理任务。
理解 peek() 的实际行为
在标准队列(如 LinkedList、PriorityQueue)中,peek() 返回的是队列头部的元素,也就是按顺序即将被 poll() 取出的那个任务。它不会修改队列长度、顺序或内部状态。
例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
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"</string>
常见误区与注意事项
-
peek() 不等于 “看下一个”:如果已调用过
poll(),队首自然更新;peek()永远只看当前队首,不是“历史下一个”或“预测下一个”。 -
空队列返回 null:对空队列调用
peek()返回null,需判空避免 NPE。 - PriorityQueue 的“队首”由优先级决定:不是插入顺序最前的,而是优先级最高(或最小,取决于比较器)的那个任务。
安全预览的推荐写法
为避免空指针和逻辑混淆,建议封装一层检查:
public static <t> Optional<t> peekSafe(Queue<t> queue) {
return Optional.ofNullable(queue.peek());
}
// 使用示例
peekSafe(queue).ifPresent(task -> System.out.println("下一个任务是:" + task));</t></t></t>
如果真想预览“未来队首”(非标准需求)
标准 Queue 接口不支持跳过当前队首看后续元素。若业务需要预览第 2 个任务,只能:
- 临时
poll()当前队首 → 记录新队首 → 再把原队首offer()回去(仅适用于允许重入且无并发的场景); - 改用
Deque并遍历,或使用带索引的结构(如ArrayList)配合自定义队列逻辑; - 更稳妥的方式:用
Iterator获取前几个元素(注意部分实现不保证迭代顺序与出队顺序一致)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










