java中priorityqueue默认为小顶堆,队首最小;实现大顶堆需传入comparator,如collections.reverseorder();底层为堆结构,仅保证队首优先级,不完全有序;时间复杂度o(log n);不线程安全、不支持null、遍历无序。

Java 中 PriorityQueue 默认实现的是小顶堆(最小元素在队首),要实现大顶堆(最大元素在队首),需传入自定义比较器。它底层基于堆结构,但不保证完全有序,只保证队首元素满足优先级条件。
默认就是小顶堆:自然顺序或 Comparable
如果元素实现了 Comparable 接口(如 Integer、String),直接使用无参构造器,队列按升序排列,队首是最小值:
PriorityQueue<integer> minHeap = new PriorityQueue();</integer>- 插入
3, 1, 4, 2后,poll()依次返回1, 2, 3, 4 - 内部维护的是最小堆结构,时间复杂度:插入和删除均为
O(log n)
用 Comparator 实现大顶堆
只需传入一个反转自然顺序的比较器,常见写法有三种:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new PriorityQueue(Collections.reverseOrder())new PriorityQueue((a, b) -> b.compareTo(a))-
new PriorityQueue((a, b) -> Integer.compare(b, a))(推荐用于基本类型包装类,避免空指针)
例如:PriorityQueue<integer> maxHeap = new PriorityQueue(Collections.reverseOrder());</integer>,插入 3, 1, 4, 2 后,poll() 返回 4, 3, 2, 1。
自定义对象的大/小顶堆:必须提供 Comparator
若元素是自定义类(如 Task),且未实现 Comparable,或想按特定字段排序(比如按优先级字段 priority 降序),必须显式传入比较器:
- 按
priority升序(小顶堆):(a, b) -> Integer.compare(a.priority, b.priority) - 按
priority降序(大顶堆):(a, b) -> Integer.compare(b.priority, a.priority) - 注意:不要直接用
a.priority - b.priority,可能整数溢出
几个关键注意事项
PriorityQueue 不是线程安全的;不支持 null 元素;遍历(如用 for-each)不按堆序输出,仅 peek()/poll() 保证优先级;扩容机制类似 ArrayList,初始容量为 11。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










