您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java集合Queue-PriorityQueue的方法
## 概述
`PriorityQueue`是Java集合框架中实现`Queue`接口的重要类,基于优先级堆(通常是最小堆)实现。与普通队列的FIFO原则不同,`PriorityQueue`会根据元素的自然顺序或自定义`Comparator`进行动态排序,保证每次出队操作总是返回当前队列中的最高优先级元素。
## 核心方法详解
### 1. 构造方法
```java
// 默认初始容量(11)和自然排序
PriorityQueue<Integer> pq1 = new PriorityQueue<>();
// 指定初始容量
PriorityQueue<Integer> pq2 = new PriorityQueue<>(20);
// 使用自定义Comparator
PriorityQueue<String> pq3 = new PriorityQueue<>(
(a,b) -> b.length() - a.length() // 按字符串长度降序
);
// 从其他集合创建
List<Integer> list = Arrays.asList(5,3,8);
PriorityQueue<Integer> pq4 = new PriorityQueue<>(list);
boolean add(E e) // 插入元素,失败时抛出异常
boolean offer(E e) // 推荐使用,插入失败返回false
// 示例:
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(10); // 返回true
pq.add(5); // 队列变为[5,10]
E peek() // 获取但不移除队首元素(空队列返回null)
E element() // 功能同peek(),但空队列抛出NoSuchElementException
// 示例:
Integer val = pq.peek(); // 返回5
E poll() // 移除并返回队首元素(空队列返回null)
E remove() // 功能同poll(),但空队列抛出异常
boolean remove(Object o) // 删除指定元素
// 示例:
pq.poll(); // 移除并返回5
pq.remove(10); // 手动移除元素10
int size() // 返回元素数量
void clear() // 清空队列
boolean contains(Object o) // 检查元素是否存在
Object[] toArray() // 转为对象数组
Comparator
反转:// 创建最大堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(
Collections.reverseOrder()
);
操作 | 时间复杂度 |
---|---|
offer/add | O(log n) |
poll/remove | O(log n) |
peek | O(1) |
contains | O(n) |
NullPointerException
PriorityBlockingQueue
PriorityQueue<Task> taskQueue = new PriorityQueue<>(
Comparator.comparing(Task::getPriority)
);
taskQueue.offer(new Task("紧急修复", 1));
taskQueue.offer(new Task("日常维护", 3));
Task nextTask = taskQueue.poll(); // 总是获取优先级最高的任务
// 找出最大的K个元素
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int num : nums) {
minHeap.offer(num);
if (minHeap.size() > k) {
minHeap.poll();
}
}
PriorityQueue<ListNode> pq = new PriorityQueue<>(
Comparator.comparingInt(a -> a.val)
);
// 将各链表头节点入队
while (!pq.isEmpty()) {
ListNode min = pq.poll();
// 处理min节点...
}
特性 | PriorityQueue | ArrayDeque | LinkedList |
---|---|---|---|
底层结构 | 堆 | 循环数组 | 双向链表 |
排序 | 支持 | 不支持 | 不支持 |
允许null | 否 | 否 | 是 |
线程安全 | 否 | 否 | 否 |
插入/删除时间复杂度 | O(log n) | O(1) | O(1) |
PriorityQueue
是处理优先级任务的理想选择,其核心优势在于动态维护元素顺序。虽然相比普通队列有额外的性能开销,但在需要按优先级处理的场景下能显著简化代码逻辑。使用时需注意其非线程安全特性和特殊的排序机制。
“`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。