在Java中,PriorityQueue
是一种基于优先级的队列,它的元素按照自然顺序或者由比较器指定的顺序进行排序。PriorityQueue
是 Java 集合框架的一部分,提供了在处理需要按照优先级顺序访问元素的场景时的极大便利。
本文将循序渐进地介绍 PriorityQueue
,从基本用法到高级特性,再到源码解析,配合示例代码和详细注解,帮助读者全面理解 PriorityQueue
的使用。
基本概念
PriorityQueue
是一个基于堆实现的数据结构。默认情况下,它是一个最小堆,即队列头部的元素是最小的。可以通过传入自定义比较器来改变排序方式,例如构建最大堆。
创建和使用 PriorityQueue
1. 创建一个最小堆
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) {
// 创建一个最小堆的优先队列
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
// 添加元素
minHeap.add(10);
minHeap.add(5);
minHeap.add(20);
minHeap.add(15);
// 输出并移除队列头部的元素,直到队列为空
while (!minHeap.isEmpty()) {
System.out.println(minHeap.poll()); // 输出顺序是:5, 10, 15, 20
}
}
}
在上述示例中,我们创建了一个最小堆的 PriorityQueue
,并通过 add
方法向队列中添加元素。poll
方法用于获取并移除队列头部的元素,按照元素的自然顺序输出。
2. 创建一个最大堆
import java.util.Collections;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) {
// 创建一个最大堆的优先队列,通过传入一个反转比较器
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
// 添加元素
maxHeap.add(10);
maxHeap.add(5);
maxHeap.add(20);
maxHeap.add(15);
// 输出并移除队列头部的元素,直到队列为空
while (!maxHeap.isEmpty()) {
System.out.println(maxHeap.poll()); // 输出顺序是:20, 15, 10, 5
}
}
}
在这个示例中,我们通过 Collections.reverseOrder()
创建了一个最大堆的 PriorityQueue
。输出的顺序是元素按从大到小排列。
自定义对象的 PriorityQueue
PriorityQueue
也可以存储自定义对象。这时,我们需要实现 Comparable
接口或者提供一个 Comparator
来定义对象的排序方式。
3. 使用 Comparable
接口
假设我们有一个 Person
类,并且我们希望按年龄排序:
class Person implements Comparable<Person> {
String name;
int age;
public Person