Java集合(四二):PriorityQueue

目录

一、优先级队列 PriorityQueue

二、示例:

三、使用场景


一、优先级队列 PriorityQueue

PriorityQueue 类在 Java 1.5 中引入。

  • PriorityQueue 是基于优先堆的一个无界队列,是Queue接口的一个队列实现类,但它的排序并不是典型的队列式先进先出(FIFO)的方式。
  • PriorityQueue的排序方式分为两种,一种是自然排序,这是按照加入元素的大小从小到大排序的。第二种是定制排序,是使用comparator类来重写compare(Object o1,Object o2)方法来实现定制排序的。但是这些都不是关键,关键在于PriorityQueue的排序不是普通的排序,而是堆排序。
  • PriorityQueue 不允许空值,而且不支持 non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用 Java Comparable 和 Comparator 接口给对象排序,并且在排序时会按照优先级处理其中的元素。
  • PriorityQueue 的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。
  • PriorityQueue 是非线程安全的,所以 Java 提供了 PriorityBlockingQueue(实现 BlockingQueue接口)用于Java 多线程环境。

二、示例:

 public static void main(String[] args) {
        PriorityQueue<String> priorityQueue = new PriorityQueue();
        priorityQueue.offer("b");
        priorityQueue.offer("t");
        priorityQueue.offer("a");
        System.out.println(priorityQueue);//[a, t, b]
}

不是说是按从小到大来排序的吗?怎么没排序?

原因是堆排序只会保证第一个元素也就是根节点的元素是当前优先队列里最小(或者最大)的元素,而且每一次变化之后,比如offer()或者poll()之后,都会进行堆重排,所以如果想要按从小到大的顺序取出元素,那么需要用一个for循环

如下:

 public static void main(String[] args) {
        PriorityQueue<String> priorityQueue = new PriorityQueue();
        priorityQueue.offer("b");
        priorityQueue.offer("t");
        priorityQueue.offer("a");
        int size = priorityQueue.size();//取出.size()大小,因为每一次poll()之后size大小都会变化,所以不能作为for循环的判断条件
        while(!priorityQueue.isEmpty()){
            System.out.println(priorityQueue.poll());//abt
        }
}

三、使用场景

求 Top K 大的元素
维护数据流中的中位数

参考:https://www.jianshu.com/p/c577796e537a
参考:Java中PriorityQueue的排序,堆排序_苦咖啡的自留地-CSDN博客_priorityqueue 排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值