当前位置:   article > 正文

Java - 重要集合:PriorityQueue_java priorityqueue是线程安全嘛

java priorityqueue是线程安全嘛

目录

一.导语

二.offer,poll,peak等 默认是小根堆!


一.导语

Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的

通过观察源码: 

使用必须导包!

堆有很多方法的,接下来我们将学习堆!

PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常


不能插入null对象,否则会抛出NullPointerException


没有容量限制,可以插入任意多个元素,其内部可以自动扩容

二.offer,poll,peak等 默认是小根堆!

offer插入的对象,必须是可以比较的否则会抛异常!


 这种情况必须Student类必须可以比较


究其本质,我们来学习源码:

第一行,看其源码中的构造方法:

该构造方法作用:        调用有俩个参数的构造方法 

       

 第二步:offer

第三步:第二次offer

如果我们想使用小根堆来实现,该怎么办呢?

如果是在Student类内改写比较容易!

将Student类的compareTo方法改写一下,但如果是Interger包装类型呢?

这里需要传入一个比较器!

比较器:

  1. class Intcmp implements Comparator<Integer>{
  2. @Override
  3. public int compare(Integer o1, Integer o2) {
  4. return o2 - o1;
  5. }
  6. }

main函数

  1. public static void main(String[] args) {
  2. PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(11,new Intcmp());
  3. priorityQueue.offer(12);
  4. priorityQueue.offer(3);
  5. System.out.println(priorityQueue.poll());
  6. System.out.println(priorityQueue.poll());
  7. }


比较器也可以使用匿名内部类来传入

  1. public static void main(String[] args) {
  2. PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(11,new Comparator<Integer>(){
  3. public int compare(Integer o1, Integer o2) {
  4. return o2 - o1;
  5. }
  6. });
  7. priorityQueue.offer(12);
  8. priorityQueue.offer(3);
  9. System.out.println(priorityQueue.poll());
  10. System.out.println(priorityQueue.poll());
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/782789
推荐阅读
相关标签
  

闽ICP备14008679号