在Java中,PriorityQueue
是一个基于优先级的队列。它的元素按照自然顺序(对于可比较元素)或者通过提供的 Comparator
进行排序。默认情况下,PriorityQueue
的排序规则是最小堆,也就是说,队列的头部总是最小的元素。
以下是 PriorityQueue
的一些主要特性:
- 排序方式:如果队列中的元素实现了
Comparable
接口,那么它们将根据自然顺序进行排序。否则,你需要提供一个Comparator
来定义排序规则。 - 插入和删除操作:插入和删除操作的时间复杂度为 O(log n),其中 n 是队列中的元素数量。
- 不允许插入 null 元素:尝试插入 null 元素会抛出
NullPointerException
。 - 非线程安全:
PriorityQueue
不是线程安全的。如果多个线程同时访问一个PriorityQueue
,而至少有一个线程修改了队列,那么它必须保持外部同步。 - 不保证同优先级元素的顺序:如果两个元素具有相同的优先级,那么它们在队列中的顺序是不确定的。
如果你想要一个最大堆的优先队列,你可以在自定义类中实现 Comparable
接口并重写 compareTo
方法,或者提供一个自定义的 Comparator
。例如,对于整数,你可以这样创建一个最大堆的 PriorityQueue
:
PriorityQueuemaxHeap = new PriorityQueue<>((a, b) -> b - a);
这将创建一个 PriorityQueue
,其中整数按照降序排列。