Java中PriorityQueue是基于优先堆的无界队列,1. 默认按自然顺序排序,最小值优先出队;2. 可通过Comparator自定义排序,如降序或按对象字段排序;3. 常用于任务调度等需优先级处理的场景,但非线程安全。

Java中的PriorityQueue是一个基于优先堆的无界队列,元素按照自然顺序或者通过提供的Comparator进行排序。它保证出队的元素总是当前队列中优先级最高(默认最小)的元素。
基本使用:默认自然排序
下面是一个使用PriorityQueue存储整数的例子,默认按升序排列,最小值优先出队:
Queuepq = new PriorityQueue<>(); pq.offer(5); pq.offer(1); pq.offer(3); System.out.println(pq.poll()); // 输出 1 System.out.println(pq.poll()); // 输出 3 System.out.println(pq.poll()); // 输出 5
自定义比较器:实现降序排序
如果希望最大值优先出队,可以通过传入Comparator来反转排序规则:
Queuepq = new PriorityQueue<>(Collections.reverseOrder()); pq.offer(5); pq.offer(1); pq.offer(3); System.out.println(pq.poll()); // 输出 5 System.out.println(pq.poll()); // 输出 3 System.out.println(pq.poll()); // 输出 1
处理自定义对象:按指定字段排序
假设有一个Task类,包含名称和优先级,我们希望优先级数值越小,越优先执行:
立即学习“Java免费学习笔记(深入)”;
class Task {
String name;
int priority;
public Task(String name, int priority) {
this.name = name;
this.priority = priority;
}
@Override
public String toString() {
return name + "(优先级:" + priority + ")";
}
}
创建一个按优先级排序的队列:
QueuetaskQueue = new PriorityQueue<>((t1, t2) -> Integer.compare(t1.priority, t2.priority)); taskQueue.offer(new Task("任务A", 3)); taskQueue.offer(new Task("任务B", 1)); taskQueue.offer(new Task("任务C", 2)); while (!taskQueue.isEmpty()) { System.out.println(taskQueue.poll()); } // 输出: // 任务B(优先级:1) // 任务C(优先级:2) // 任务A(优先级:3)
常用方法说明
- offer(E e):将元素插入队列,自动调整堆结构
- poll():取出并移除队首元素(优先级最高)
- peek():查看队首元素但不移除
- size():返回队列元素个数
- isEmpty():判断队列是否为空










