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,可以实现高效的优先级管理,尤其在需要快速获取最高优先级元素的场景中效果显著。