优先级队列概念及PriorityQueue底层扩容机制

优先级队列的概念

队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,在这种情况下,我们的数据结构应该提供两个最基本的操作:一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就是优先级队列(Priority Queue)。
Java集合框架中提供了 PriorityQueuePriorityBlockingQueue 两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,此处主要介绍PriorityQueue。

PriorityQueue

使用注意:

  1. 插入的元素是要可以比较的值,且不能为null
  2. 插入/删除–》再插入和删除元素期间,优先级队列中的元素会自己进行调整,但是无论怎么调整,0号位置的元素始终都是最小的(这是默认情况下的),可以通过某些方式使首元素最大
  3. 优先级队列的底层结构是堆
  4. 插入和删除的时间复杂度是O(logN)
  5. PriorityQueue底层使用了堆数据结构

PriorityQueue常用接口

构造方法:
构造器特点及功能介绍
PriorityQueue()创建一个空的优先级队列默认容量是11
PriorityQueue(int initialCapacity)创建一个初始容量为initialCatacity的优先级队列,如果知道优先级队列中大概要放多少个元素,最好使用该方法进行构造,不要使用空的构造方式构造,因为在插入元素是需要不断地扩容而影响程序效率
PriorityQueue((Collection<? extends E> c)用集合来创建一个优先级队列,例子见下q3
  1. 无参的构造函数:
    在这里插入图片描述
    在这里插入图片描述
    有源码可以看出他的初始默认容量为11
    扩容机制
    在这里插入图片描述
public static void TestPriorityQueue(){
 	// 创建一个空的优先级队列,底层默认容量是11
	 PriorityQueue<Integer> q1 = new PriorityQueue<>();
	 
	 // 创建一个空的优先级队列,底层的容量为initialCapacity=100
	 PriorityQueue<Integer> q2 = new PriorityQueue<>(100);
	 
	 ArrayList<Integer> list = new ArrayList<>();
	 list.add(4);
	 list.add(3);
	 list.add(2);
	 list.add(1);
	 // 用ArrayList对象来构造一个优先级队列的对象
	 PriorityQueue<Integer> q3 = new PriorityQueue<>(list);
	 System.out.println(q3.size());
	 System.out.println(q3.peek());
其他接口
构造器返回值类型特点及功能介绍
offer(E e)boolean往优先级队列中添加元素,插入成功返回true,如果e为null,抛出NullPointerException异常,时间复杂度为O(log2N) ,注意:空间不够的时候会自动进行扩容
peek()E获取优先级最高的元素,如果优先级队列为空,返回null
poll()E移除优先级最高的元素,如果优先级队列为空,返回null
size()int返回队列中元素个数
clearvoid清空优先级队列的元素
isEmpty()boolean判空

注意:优先级队列插入元素期间,里面的元素会进行不断调整,首元素一定是最小的,但最大的不一定在最后

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值