PriorityQueue
是 Java 集合框架中实现的一种特殊队列,它遵循优先级排序的原则来存储元素,而不是按插入顺序。它适用于需要高效访问和移除优先级最高(或最低)元素的场景。PriorityQueue
基于最小堆(默认),可以自定义优先级顺序。
1. 基本特性
最小堆结构:默认情况下,
PriorityQueue
实现了最小堆,即每次检索或删除的都是当前队列中优先级最高的元素(最小值)。自定义排序:可以通过实现
Comparator
接口来自定义优先级。例如,若需要最大堆,可以提供一个自定义的比较器。线程不安全:
PriorityQueue
不是线程安全的,多线程环境中可以使用PriorityBlockingQueue
作为替代。
2. 创建和初始化
默认构造:无参构造时创建空的优先队列。
java复制代码PriorityQueue<Integer> pq = new PriorityQueue<>();
指定初始容量:可以指定队列的初始容量(默认为 11)。
java复制代码PriorityQueue<Integer> pq = new PriorityQueue<>(20);
使用自定义 Comparator:传入
Comparator
实现来设置自定义排序规则。java复制代码PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
3. 主要方法
添加元素:
add(E e)
或offer(E e)
方法插入元素。java复制代码pq.add(10); // 抛出异常时使用pq.offer(5); // 返回 false 时使用
获取和移除优先元素:
java复制代码int top = pq.peek(); // 查看优先级最高的元素int removed = pq.poll(); // 移除优先级最高的元素
peek()
:返回最高优先级的元素,但不移除。poll()
:移除并返回最高优先级的元素。检查空状态和大小:
isEmpty()
:判断队列是否为空。size()
:获取当前队列的元素数量。
4. 内部实现
堆实现:
PriorityQueue
采用了基于数组的二叉堆(通常是最小堆)来管理元素,因此插入和删除操作的时间复杂度为 O(log N)。自动扩容:当元素数量超过当前容量时,
PriorityQueue
自动扩容,并重新分配数组空间。
5. 常见应用场景
任务调度:用于实现任务的优先级调度(如延迟队列)。
Kth元素查找:可以在数据流或大量元素中查找第K个最大/最小值。
实时排行榜:用于实现排行榜数据的动态排序。
6. 使用示例
java复制代码import java.util.PriorityQueue;public class PriorityQueueExample { public static void main(String[] args) { PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.offer(10); pq.offer(5); pq.offer(20); while (!pq.isEmpty()) { System.out.println(pq.poll()); // 输出按优先级排序的元素 } } }
注意事项
不支持 null 元素:插入
null
会抛出NullPointerException
。多线程环境:需要使用
PriorityBlockingQueue
或其他线程安全的实现。定制化需求:对于更复杂的优先队列逻辑,可以使用
Comparator
进行灵活控制。
通过 PriorityQueue
,可以实现高效的优先级管理,尤其在需要快速获取最高优先级元素的场景中效果显著。