Java PriorityQueue 详解:基础、操作与自定义排序
Java PriorityQueue
通过清晰示例与最佳实践,探索 Java 集合框架中 PriorityQueue 类的用法。
PriorityQueue 类实现了堆数据结构,实现 Queue 接口,能根据优先级而非插入顺序高效获取元素。

与普通队列不同,元素按排序顺序返回。若需升序,队头为最小元素;每次移除得到下一个最小值。注意内部顺序不保证,仅出队顺序有序。
创建 PriorityQueue
先导入 java.util.PriorityQueue:
import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();
默认使用自然顺序(升序)。可通过构造器传入 Comparator 自定义顺序。
PriorityQueue 的关键方法
包含 Queue 接口所有方法,外加少量队列专用操作。
插入元素
add()— 添加元素;队列满时抛异常。offer()— 添加元素;队列满时返回false。
示例:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
System.out.println("PriorityQueue: " + numbers);
numbers.offer(1);
System.out.println("更新后的 PriorityQueue: " + numbers);
}
}
输出
PriorityQueue: [2, 4] 更新后的 PriorityQueue: [1, 4, 2]
尽管 4 先于 2 加入,但队头仍为 2(最小)。加入 1 后,1 成为新队头。
访问元素
用 peek() 查看队头而不移除:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
int number = numbers.peek();
System.out.println("访问的元素: " + number);
}
}
输出
PriorityQueue: [1, 4, 2] 访问的元素: 1
移除元素
remove()— 删除指定元素,成功返回true。poll()— 获取并移除队头。
示例:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
boolean result = numbers.remove(2);
System.out.println("元素 2 是否移除? " + result);
int number = numbers.poll();
System.out.println("poll() 移除的元素: " + number);
}
}
输出
PriorityQueue: [1, 4, 2] 元素 2 是否移除? true poll() 移除的元素: 1
遍历 PriorityQueue
使用 iterator()(需 java.util.Iterator):
import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.print("PriorityQueue 遍历: ");
Iterator<Integer> iterate = numbers.iterator();
while (iterate.hasNext()) {
System.out.print(iterate.next() + ", ");
}
}
}
输出
PriorityQueue 遍历: 1, 4, 2,
其他常用方法
| 方法 | 说明 |
|---|---|
contains(element) | 判断元素是否存在 |
size() | 返回元素数量 |
toArray() | 转换为数组 |
使用 Comparator 自定义排序
为实现逆序或任意优先级,构造队列时传入 Comparator:
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}
class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a); // 逆序
}
}
输出
PriorityQueue: [4, 3, 1, 2]
自定义比较器使队头成为最大元素。更多细节请参考 Java Comparator API。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比