本文重点介绍PriorityQueue的使用,不涉及源码分析,如有误,欢迎在评论区指出!
PriorityQueue即优先队列,从下图可以看出,它实现了Queue,满足FIFO的原则。 但是与普通Queue不同,优先队列元素是按排序顺序检索的。

创建
普通
当不规定任何优先级,默认情况是,队列的头是队列中最小的元素。元素将按升序从队列中移除。
PriorityQueue<Integer> pq = new PriorityQueue<>();
Plus
要想规定优先级,可以借助Comparator接口自定义元素的顺序。
重写compare的方法主要有三种:创建类、匿名内部类、lambda表达式。
这里推荐我自己采用lambda表达式重写,原因是简洁🥲
降序存储:
PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> b-a);
这样写更简洁😎
PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
如果想要定义更加复杂的优先级关系,可以先写一个自定义比较器,然后作为参数传递给PriorityQueue像这样⬇️
// 按照用户姓名的字典顺序排列
Comparator<UserInfo> comparator = Comparator.comparing(user -> user.name);
// 或者按照先按用户年龄升序,年龄相同时按工资降序排列
Comparator<UserInfo> comparator = Comparator
.comparingInt((UserInfo user) -> user.age) // 按照年龄升序
thenComparingDouble(user -> user.salary, Comparator.reverseOrder()); // 年龄相同按照工资降序
PriorityQueue<UserInfo> pq = new PriorityQueue<>(comparator);
这段代码是gpt写的,我感觉不够标准常用,以后我写题遇到复杂的,学习到常用的,再补充。也欢迎了解的大佬在评论区教教我😀😀
插入元素
- add() - 将指定的元素插入队列。如果队列已满,则会引发异常。
- offer() - 将指定的元素插入队列。如果队列已满,则返回false。
删除元素
- remove() - 从队列中删除指定的元素
- poll() - 返回并删除队列的开头
访问元素
- peek() - 返回队列的头部
遍历元素
- 使用iterator()方法
Iterator<Integer> iter = pq.iterator();
while(itere.hasNext()) {
System.out.print(iter.next());
System.out.print(", ");
}
如果本文对你有帮助的话,不妨点个小赞👍帮助更多的小伙伴!!!