Java集合Queue-PriorityQueue的方法

发布时间:2021-06-22 14:02:39 作者:chen
来源:亿速云 阅读:183
# 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);

2. 元素操作

添加元素

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

3. 辅助方法

int size()         // 返回元素数量
void clear()       // 清空队列
boolean contains(Object o) // 检查元素是否存在
Object[] toArray() // 转为对象数组

特性与注意事项

排序特性

// 创建最大堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(
    Collections.reverseOrder()
);

时间复杂度

操作 时间复杂度
offer/add O(log n)
poll/remove O(log n)
peek O(1)
contains O(n)

使用限制

  1. 不允许null元素:添加null会抛出NullPointerException
  2. 非线程安全:多线程环境需使用PriorityBlockingQueue
  3. 迭代顺序不确定:迭代器不保证按优先级顺序遍历

典型应用场景

1. 任务调度系统

PriorityQueue<Task> taskQueue = new PriorityQueue<>(
    Comparator.comparing(Task::getPriority)
);
taskQueue.offer(new Task("紧急修复", 1));
taskQueue.offer(new Task("日常维护", 3));
Task nextTask = taskQueue.poll();  // 总是获取优先级最高的任务

2. Top K问题

// 找出最大的K个元素
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int num : nums) {
    minHeap.offer(num);
    if (minHeap.size() > k) {
        minHeap.poll();
    }
}

3. 合并有序链表

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是处理优先级任务的理想选择,其核心优势在于动态维护元素顺序。虽然相比普通队列有额外的性能开销,但在需要按优先级处理的场景下能显著简化代码逻辑。使用时需注意其非线程安全特性和特殊的排序机制。 “`

推荐阅读:
  1. JAVA集合概述
  2. Java集合怎么用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:网络挖矿的原理是什么

下一篇:怎么隐藏css样式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》