Java中PriorityQueue默认为小顶堆,实现大顶堆需传入逆序Comparator:推荐用Comparator.reverseOrder(),整数可用(a,b)->b.compareTo(a),自定义类按字段降序比较,注意避免溢出和null异常。

Java 中 PriorityQueue 默认是小顶堆,要实现大顶堆,只需传入一个**逆序比较的 Comparator**,让大的元素优先级更高(即排在队首)。
用 Lambda 表达式(最常用)
直接在构造时传入 `(a, b) -> b - a`(适用于整数),或 `Comparator.reverseOrder()`(推荐,通用且安全):
- 对
Integer:`new PriorityQueue((a, b) -> b.compareTo(a))` - 更简洁写法:`new PriorityQueue(Comparator.reverseOrder())`
- 对自定义类(如
Person按年龄降序):new PriorityQueue((p1, p2) -> Integer.compare(p2.age, p1.age))
用匿名内部类(兼容老版本 Java)
逻辑相同,写法稍冗长,适合需要多行逻辑或 Java 7 及以下环境:
new PriorityQueue<Integer>(new Comparator<Integer>() {<br> @Override<br> public int compare(Integer a, Integer b) {<br> return b - a; // 注意可能溢出,建议用 b.compareTo(a)<br> }<br>});
用自定义 Comparator 类(适合复用场景)
当多个地方需要同一套排序规则时,可单独定义类,提高可读性和复用性:
立即学习“Java免费学习笔记(深入)”;
- class MaxIntComparator implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
return b.compareTo(a);
}
} - 使用:
new PriorityQueue<>(new MaxIntComparator())
注意事项
避免常见坑:
-
不要用
b - a对 long/Integer 做减法:可能整数溢出,应始终用compareTo()或Integer.compare(b, a) -
PriorityQueue不保证完全有序,只保证peek()/poll()返回最大(或最小)元素 - 如果元素为
null,且 Comparator 未处理,会抛NullPointerException - 自定义类必须确保
compare(a, b) == 0时,a.equals(b)最好也为 true(非强制但推荐)


















