2019独角兽企业重金招聘Python工程师标准>>>

Java PriorityQueue && PriorityBlockingQueue

我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户。在这种情况下,Java的PriorityQueue(优先队列)会很有帮助。

PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。

优先队列不允许空值,而且不支持non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。

优先队列的头是基于自然排序或者Comparator排序的最小元素。如果有多个对象拥有同样的排序,那么就可能随机地取其中任意一个。当我们获取队列时,返回队列的头对象。

优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。

PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境。

我们有一个用户类Customer,它没有提供任何类型的排序。当我们用它建立优先队列时,应该为其提供一个比较器对象。

Customer.java

package com.journaldev.collections;public class Customer {private int id;private String name;public Customer(int i, String n){this.id=i;this.name=n;}public int getId() {return id;}public String getName() {return name;}}

我们使用Java随机数生成随机用户对象。对于自然排序,我们使用Integer对象,这也是一个封装过的Java对象。下面是最终的测试代码,展示如何使用PriorityQueue:

PriorityQueueExample.java

package com.journaldev.collections;import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;public class PriorityQueueExample {public static void main(String[] args) {//优先队列自然排序示例Queue<Integer> integerPriorityQueue = new PriorityQueue<>(7);Random rand = new Random();for(int i=0;i<7;i++){integerPriorityQueue.add(new Integer(rand.nextInt(100)));}for(int i=0;i<7;i++){Integer in = integerPriorityQueue.poll();System.out.println("Processing Integer:"+in);}//优先队列使用示例Queue<Customer> customerPriorityQueue = new PriorityQueue<>(7, idComparator);addDataToQueue(customerPriorityQueue);pollDataFromQueue(customerPriorityQueue);}//匿名Comparator实现public static Comparator<Customer> idComparator = new Comparator<Customer>(){@Overridepublic int compare(Customer c1, Customer c2) {return (int) (c1.getId() - c2.getId());}};//用于往队列增加数据的通用方法private static void addDataToQueue(Queue<Customer> customerPriorityQueue) {Random rand = new Random();for(int i=0; i<7; i++){int id = rand.nextInt(100);customerPriorityQueue.add(new Customer(id, "Pankaj "+id));}}//用于从队列取数据的通用方法private static void pollDataFromQueue(Queue<Customer> customerPriorityQueue) {while(true){Customer cust = customerPriorityQueue.poll();if(cust == null) break;System.out.println("Processing Customer with ID="+cust.getId());}}}

注意我用实现了Comparator接口的Java匿名类,并且实现了基于id的比较器。

当我运行以上测试程序时,我得到以下输出:

Processing Integer:9
Processing Integer:16
Processing Integer:18
Processing Integer:25
Processing Integer:33
Processing Integer:75
Processing Integer:77
Processing Customer with ID=6
Processing Customer with ID=20
Processing Customer with ID=24
Processing Customer with ID=28
Processing Customer with ID=29
Processing Customer with ID=82
Processing Customer with ID=96

从输出结果可以清楚的看到,最小的元素在队列的头部因而最先被取出。如果不实现Comparator,在建立customerPriorityQueue时会抛出ClassCastException。

Exception in thread "main" java.lang.ClassCastException: com.journaldev.collections.Customer cannot be cast to java.lang.Comparableat java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:633)at java.util.PriorityQueue.siftUp(PriorityQueue.java:629)at java.util.PriorityQueue.offer(PriorityQueue.java:329)at java.util.PriorityQueue.add(PriorityQueue.java:306)at com.journaldev.collections.PriorityQueueExample.addDataToQueue(PriorityQueueExample.java:45)at com.journaldev.collections.PriorityQueueExample.main(PriorityQueueExample.java:25)

==========END==========

转载于:https://my.oschina.net/xinxingegeya/blog/366619

Java PriorityQueue PriorityBlockingQueue相关推荐

  1. Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用

    目录 PriorityQueue有几个需要注意的点: 重写比较器的方法 应用题目 LeetCode 1845. 座位预约管理系统 LeetCode 215. 数组中的第 K 个最大元素(同剑指 Off ...

  2. Java PriorityQueue实现大顶堆

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.PriorityQueue位于Java util包中,实际上这个队列就是具有"优先级".既然具有优 ...

  3. Java - PriorityQueue

    JDK 10.0.2 前段时间在网上刷题,碰到一个求中位数的题,看到有网友使用PriorityQueue来实现,感觉其解题思想挺不错的.加上我之前也没使用过PriorityQueue,所以我也试着去读 ...

  4. Java PriorityQueue clear()方法与示例

    PriorityQueue类clear()方法 (PriorityQueue Class clear() method) clear() method is available in java.uti ...

  5. Java PriorityQueue poll()方法与示例

    PriorityQueue类poll()方法 (PriorityQueue Class poll() method) poll() method is available in java.util p ...

  6. Java PriorityQueue优先队列详解(源码+图文步骤解析)

    文章目录 1.概述 2.入队分析 3.出队分析 4.总结 1.概述 PriorityQueue 称为优先队列,也是一种特殊的有序队列.为什么特殊呢? 因为其内部使用 Object[] 数组来存储数据, ...

  7. Java PriorityQueue

    heap inside Queue<Integer> qi = new PriorityQueue<Integer>(); 常用函数 add() poll() peek() r ...

  8. java中priorityqueue_详解JAVA中priorityqueue的具体使用

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...

  9. JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

    JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类.本文将就Java Collections Fram ...

最新文章

  1. 图纸管理软件_图纸文件管理操作繁琐?巧用“权限”,管理更高效
  2. Web开发中的矢量绘图(vml,svg)处理和应用
  3. (一)云计算OpenStack介绍
  4. python utc时间如何取整_Python和Pandas:如何在不同的分辨率上取整unix时间戳(utc):1min5min15min30min1d?...
  5. iOS-文件断点续传
  6. Wait 线程阻塞 与 Notify、NotifyAll 线程唤醒
  7. mysql 日期时间运算函数(转)
  8. log4j 配置文件参数说明
  9. 挠场的科学丨二、无线电力传送与特斯拉遗失的文件
  10. python几行代码实现微信自动发消息
  11. 不要只关注马斯克猎鹰,中国SpaceX在哪?商业航天我们不能缺席!
  12. Office下载记录
  13. 简单易懂读《重构》 - Refused Bequest (拒绝继承的遗赠)
  14. linux centos dhcpd进程,centos7 – 如何在Centos 7上忽略dhcpd中未使用的网络接口
  15. 【券后价12.90元】【包邮】植护婴儿湿巾纸宝宝湿纸巾儿童手口专用80抽家用大包装特价实惠装...
  16. Knex 使用日志输出构造的SQL语句
  17. function的用法()
  18. innobackup 备份还原原理和操作
  19. 爬虫——把jason格式用pandas化成dataframe
  20. MySQL-SQL优化分析

热门文章

  1. 对typedef void (*sighandler_t)(int)的理解(声明了一种类型:sighandler_t)
  2. OpenGL画矩形,三角形,点(第一个图形学的小程序)
  3. php遍历指定目录中的内容2
  4. String to Integer (atoi) leetcode java
  5. 设计师必备网址 百度MUX
  6. Event ID 5553 failure trying to synch sitexxxx for ContentDB xx WebApp xx. Exception message ...
  7. 浅谈视觉设计的准确性
  8. Document,Node,Element,HTMLDocument ,HTMLCollection,HTMLElement,NodeList
  9. 谈一谈:抽象工厂+反射+配置文件 实现数据访问程序
  10. Cubieboard ARM 集群