java 优先级队列_JAVA 队列

java 优先级队列_JAVA 队列优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用。优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据。优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。举个例子来说,一组整型数,如果使用优先级队列的话,不管队列之前放入的数据如何,后面添加进去的数据总会被按照升序或者降序排列,当然这个只是优先级队列最基本的使用,在实际生产中可能有…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用。优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据。

优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。举个例子来说,一组整型数,如果使用优先级队列的话,不管队列之前放入的数据如何,后面添加进去的数据总会被按照升序或者降序排列,

当然这个只是优先级队列最基本的使用,在实际生产中可能有如下需求,

比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户

再举一个例子,

除了上面上面的场景,这里还给出一个这样的场景,比如一个电商网站搞特卖或抢购,用户登录下单提交后,考虑这个时间段用户访问下单提交量很大,通常表单提交到服务器后端后,后端程序一般不直接进行扣库存处理,将请求放到队列列,异步消费处理,用普通队列是FIFO的,这里有个需求是,用户会员级别高的,可以优先抢购到商品,可能这个时间段的级别较高的会员用户下单时间在普通用户之后,这个时候使用优先队列代替普通队列,基本能满足我们的需求。

PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。
优先队列不允许空值,而且不支持non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。

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

优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。
PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境。

下面我们通过两段简单代码来体会一下优先级队列的使用,

1、使用优先级队列实现Integer类型数据自动排序,

	//测试优先级队列自动排序
	public static List<Integer> insertSort(){
		List<Integer> list = new ArrayList<Integer>();
		Queue<Integer> queue = new PriorityQueue<Integer>(7);
		Random random = new Random();
		for(int i=0;i<7;i++){
			queue.add(new Integer(random.nextInt(100))); 
		}
		for(int i=0;i<queue.size();i++){
			list.add(queue.poll());
		}
		return list;
	}

	public static void main(String[] args) {
		System.out.println(Arrays.toString(insertSort().toArray()));
	}

运行上述main函数,可以看到控制台打印出了排好序的结果,
在这里插入图片描述

优先级队列中,还提供了对对象的比较,下面我们来使用一下这个功能,

首先定义一个对象,

class Customer{
	
	private int id;
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Customer(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	public Customer() {
		super();
	}
	
}

再实现一个通过ID进行对象比较的比较器,

//对象比较器
	public static Comparator<Customer> idComparator = new Comparator<Customer>() {
		public int compare(Customer o1, Customer o2) {
			return (int)(o1.getId() - o2.getId());
		}
	};
//对象排序
	public static void insertObjSort(){
		Queue<Customer> queue = new PriorityQueue<Customer>(7,idComparator);
		Random random = new Random();
		for(int i=0;i<7;i++){
			int id = new Integer(random.nextInt(100));
			queue.add(new Customer(id,"name:" + i));
		}
		while(true){
			Customer one = queue.poll();
			if(queue.isEmpty()){
				break;
			}
			System.out.println(one.getId() + " " + one.getName());
		}
		
	}

同样,给出测试方法,

public static void main(String[] args) {
		//System.out.println(Arrays.toString(insertSort().toArray()));
		insertObjSort();
	}

运行main函数,观察控制台输出结果,
在这里插入图片描述

可以看到,通过优先级队列,我们实现了通过比较ID获得了对于对象比较的结果;

本篇到此结束,感谢观看!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193491.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java转义字符之换行字符

    java转义字符之换行字符我们知道,java代码中,\r和\n和\r\n都表示换行,当我们想输出“\n”时,如果直接写System.println(“\n”);是看不到任何东西的,因为其自动被转义为换行了。这时,我们就需要使用转义字符了。这里先给出转义字符:使用示例:输出结果为:注: \r是回车符;&nbsp…

    2022年7月7日
    122
  • 解开Android应用程序组件Activity的”singleTask”之谜

    解开Android应用程序组件Activity的”singleTask”之谜在Android应用程序中,可以配置Activity以四种方式来启动,其中最令人迷惑的就是”singleTask”这种方式了,官方文档称以这种方式启动的Activity总是属于一个任务的根Activity。果真如此吗?本文将为你解开Activity的”singleTask”之谜。     在解开这个谜之前,我们先来简单了解一下在Android应用程序中,任务(Task)是个什么样的概念。我们

    2022年6月26日
    20
  • 当和尚遇到钻石「建议收藏」

    当和尚遇到钻石「建议收藏」 序推荐序    麦克尔·罗奇先生,我不认识他,但是看了他写的《当和尚遇到钻石》这本书以后,令我对他产生了由衷的敬佩之意。他身在商业界,实修清净行,特别是他具有高人一等的智能,将《金刚经》融会贯通,运用万法潜能,发挥在商场的经营上……      罗奇先生的道心坚定,虽然事业经营成功,但内心从来没有忘记自己是一位修道者,他尊师重道,对师父的指示从不敢疏忽或违背,在穿着上保持着端

    2022年8月21日
    2
  • java 怎样卸载一个类_Java 动态卸载类[通俗易懂]

    java 怎样卸载一个类_Java 动态卸载类[通俗易懂]通过反射,我们可以动态的将类加载到方法区中,但是卸载这个类,却有着比较严苛的条件1.该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例。2.加载该类的ClassLoader已经被GC。3.该类的java.lang.Class对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法.publicstaticvoidmain(String[]args)th…

    2022年5月18日
    39
  • datagrip在线激活码[最新免费获取]

    (datagrip在线激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2JTX0APX6F-eyJsa…

    2022年3月29日
    94
  • Content-Disposition的使用和注意事项

    Content-Disposition的使用和注意事项我们在开发web系统时有时会有以下需求:希望某类或者某已知MIME类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框希望以原始文件名(上传时的文件名

    2022年7月1日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号