PriorityQueue的使用

概念

在了解PriorityQueue之前我们首先套清楚什么是Queue。

  • 队列(queue)与栈类似,是一种线性表。遵循“先进先出”(First In First Out) 的原则.
  • 即像排队一样刚来的人在队尾(rear)入队(push),而出队(pop)的人都是在队首(front)

但是有时候我们需要在队列中基于优先级来处理对象。比如在分座位时老师会让同学按照高低个子排队,先分矮个子的同学

  • 而PriorityQueue就是一个基于优先级的无界优先队列。
  • 即队列中元素入队后会根据我们指定的Comparator规则排队或者默认最小元素。
  • 除此之外PriorityQueue是一个无界队列,但是初始的容量会随着向队列中添加元素而不断扩容。

基本使用

PriorityQueue与普通的队列的使用方法一致,但是PriorityQueue会根据排序规则判断谁在队首谁在队尾。

默认排序规则

例如:
默认排序
根据打印情况可以看出:PriorityQueue默认采用从小到大的排序规则。

自定义排序规则

有两种方式:

  • 添加元素自身实现了Comparable接口,确保元素是可排序的状态
  • 如果添加元素没有实现Comparable接口,可以在创建PriorityQueue队列时直接指定比较器,如下:
    指定比较器

这里是创建队列时指定了比较器,然后内部类重写compare方法中写出自定义排序的逻辑。如图是按照填入数字的绝对值来排序。

小结

  1. PriorityQueue是可以实现自定义的逻辑排序的队列
  2. 但是深入源码会发现他的offer/poll方法并没有对队列锁定,所以并不是一个线程安全的队列。如果想实现线程安全,需要额外加锁
  3. 同时也要求他存储的元素必须是可以比较的队形,不是的话必须指定比较器。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PriorityQueueJava中的一个实现了Queue接口的类,它是基于优先级堆的数据结构。PriorityQueue常用于需要根据元素的优先级来进行排序和处理的场景。下面是PriorityQueue使用方法: 1. 创建PriorityQueue对象:可以使用无参构造函数创建一个默认的PriorityQueue对象,也可以使用带有Comparator参数的构造函数来定义自定义的排序规则。 2. 添加元素:可以使用`offer(E e)`方法向PriorityQueue中添加元素,该方法会根据元素的优先级将元素插入到正确的位置。 3. 删除元素:可以使用`poll()`方法从PriorityQueue中删除并返回队头的元素,该方法会同时调整剩余元素的顺序,使得队列继续保持有序状态。 4. 获取队头元素:可以使用`peek()`方法获取队头的元素,该方法不会删除元素。 5. 判断队列是否为空:可以使用`isEmpty()`方法判断PriorityQueue是否为空。 下面是一个示例代码,展示了PriorityQueue使用方法: ``` PriorityQueue<Integer> p = new PriorityQueue<>(); p.offer(5); p.offer(1); p.offer(3); p.offer(6); p.offer(8); while (!p.isEmpty()) { System.out.println(p.poll()); } ``` 以上代码会输出排序后的元素:1, 3, 5, 6, 8。 如果你想改变PriorityQueue的排序规则,你可以使用带有Comparator参数的构造函数或者在创建PriorityQueue对象后使用`comparator()`方法进行设置。例如: ``` PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1); ``` 以上代码会创建一个按照从大到小排序的PriorityQueue对象。或者: ``` PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder()); ``` 以上代码也会创建一个按照从大到小排序的PriorityQueue对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值