PriorityQueue基于堆实现,默认为最小堆,头部为最小元素;可通过Comparator.reverseOrder()实现最大堆;支持自定义比较器对对象排序;常用方法包括offer()、poll()、peek()等;不支持null元素,遍历顺序无保证。

Java中的PriorityQueue是基于堆的数据结构,能自动根据元素的优先级排序。默认情况下,它实现最小堆,即队列头部是最小元素。你可以通过自定义比较器改变排序规则,实现最大堆或按特定条件排序。
1. 基本使用方法
PriorityQueue位于java.util包中,创建实例后可以直接添加、删除和查看元素。
代码:
PriorityQueue
pq.offer(5);
pq.offer(1);
pq.offer(3);
System.out.println(pq.poll()); // 输出 1
插入元素使用offer()或add(),取出头部元素用poll()。注意poll()在队列为空时返回null。
2. 实现最大堆
如果需要最大值优先,可以传入Comparator.reverseOrder()作为构造参数。
立即学习“Java免费学习笔记(深入)”;
示例:最大堆
PriorityQueue
maxPQ.offer(5);
maxPQ.offer(1);
maxPQ.offer(3);
System.out.println(maxPQ.poll()); // 输出 5
3. 自定义对象排序
当处理自定义类时,需实现Comparable接口或提供Comparator。
class Task {
int id;
int priority;
Task(int id, int priority) { this.id = id; this.priority = priority; }
}
PriorityQueue
tasks.offer(new Task(1, 3));
tasks.offer(new Task(2, 1));
System.out.println(tasks.poll().id); // 输出 1(优先级最高)
这里使用Lambda表达式定义比较器,优先级数值大的排前面。
4. 常用方法说明
-
offer(E e):插入元素,失败时抛异常(通常不会失败) -
poll():移除并返回队首元素,队列空时返回null -
peek():查看队首元素但不移除 -
size():返回队列大小 -
isEmpty():判断是否为空
基本上就这些。使用PriorityQueue时注意它不支持null元素,且遍历时顺序不保证,只有每次poll()才是有序的。对于复杂排序逻辑,建议明确写出比较器以提高可读性。










