在日常编程中,我们经常会遇到需要按照某种优先级处理任务或数据的情况。比如:医院急诊系统要优先处理病情更严重的病人、操作系统调度器要优先运行高优先级的进程等。这时候,优先队列(Priority Queue)就派上用场了!
本文将带你从零开始,全面了解 Java 中的优先队列——PriorityQueue 类,即使是编程新手也能轻松上手。
优先队列是一种特殊的队列,它不像普通队列那样“先进先出”(FIFO),而是根据元素的优先级来决定出队顺序。优先级高的元素会先被取出。
在 Java 中,java.util.PriorityQueue 是实现优先队列的标准类。它底层通常使用堆(Heap)这种数据结构来高效地维护元素的优先级顺序。
null 值。PriorityBlockingQueue)。最简单的创建方式如下:
import java.util.PriorityQueue;public class Main { public static void main(String[] args) { PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.add(5); pq.add(1); pq.add(3); System.out.println(pq.peek()); // 输出 1(最小值) }} 上面的代码创建了一个存储整数的优先队列。调用 peek() 会返回但不移除队首元素(即当前最小值)。
如果你希望优先队列按最大值优先,或者对自定义对象排序,就需要使用 Comparator。
例如,创建一个最大堆:
PriorityQueue<Integer> maxPQ = new PriorityQueue<>((a, b) -> b - a);// 或者使用 Collections.reverseOrder()// PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Collections.reverseOrder());maxPQ.add(5);maxPQ.add(1);maxPQ.add(3);System.out.println(maxPQ.peek()); // 输出 5(最大值) 假设我们有一个 Task 类,包含任务名称和优先级数字(数字越小优先级越高):
class Task { String name; int priority; public Task(String name, int priority) { this.name = name; this.priority = priority; } @Override public String toString() { return name + "(P:" + priority + ")"; }}// 创建优先队列,按 priority 升序排列(优先级高者先出)PriorityQueue<Task> taskQueue = new PriorityQueue<>((t1, t2) -> t1.priority - t2.priority);taskQueue.add(new Task("修复Bug", 1));taskQueue.add(new Task("写文档", 3));taskQueue.add(new Task("开会", 2));System.out.println(taskQueue.poll()); // 输出:修复Bug(P:1) | 方法 | 说明 |
|---|---|
add(E e) | 插入元素(若失败抛异常) |
offer(E e) | 插入元素(失败返回 false) |
peek() | 查看队首元素(不移除) |
poll() | 移除并返回队首元素 |
size() | 返回队列大小 |
Java优先队列广泛应用于以下场景:
Comparable 接口或提供 Comparator)。poll() 才能按优先级顺序取出。通过本教程,你应该已经掌握了 PriorityQueue教程 的核心用法,并理解了其背后的 堆数据结构 原理。无论是处理简单数字还是复杂对象,Java 优先队列都能帮你高效管理任务优先级。
记住:掌握 Java队列 和优先队列,是你迈向高级 Java 开发的重要一步!快去动手试试吧!
本文由主机测评网于2025-12-02发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122000.html