概述
本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。
推荐学习:《java视频教程》
priorityQueue在Java集合框架中的关系如下:
一、使用PriorityQueue的注意点
1. 使用时必须导入PriorityQueue所在的包,即:
2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出
ClassCastException异常
3. 不能插入null对象,否则会抛出NullPointerException
4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
5. 插入和删除元素的时间复杂度为log以2为底的n
6. PriorityQueue底层使用了堆数据结构
7. PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素(想要变成大堆,需要我们重新比较方法、默认的比较方法是Comparable接口中的compareTo方法)
二、PriorityQueue常用接口介绍
1. 优先级队列的构造
此处只是列出了PriorityQueue中常见的几种构造方式,其他的大家可以参考帮助文档。
构造器 | 功能介绍 |
PriorityQueue() | 创建一个空的优先级队列,默认容量是11 |
PriorityQueue(int initialCapacity) | 创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常 |
PriorityQueue(Collection<? extends E> c) | 用一个集合来创建优先级队列 |
PriorityQueue(Comparator<? super E> comparator) | 创建具有默认初始容量的优先级队列,并根据指定的比较器对其元素进行比较 |
PriorityQueue(int initialCapacity, Comparator <? super E> comparator) | 创建一个初始容量为 注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常 |
2、PriorityQueue中对元素的比较
看完了构造方法,我们重新来思考一个问题
优先级队列是如何实现有序的呢?因为优先级队列就是借助小根堆来实现的
在实现小根堆的过程我们知道这其中一定发生了元素的比较,所以PriorityQueue中的元素必须要能够比较大小,那么PriorityQueue是如何进行元素的比较呢?
我们看到这里程序报错了,为什么呢?因为我们插入的Child对象是不可比较的(即没有实现Comparable接口又没有采用自定义的比较器)
可以看到
即我们采用了默认的比较方法Comparable接口中的compareTo方法
此时我们再次看一下报错信息
看来是在往PriorityQueue中插入元素的时候出现了问题
那么我们打开PriorityQueue的源码看一下(下面是PriorityQueue中offer方法的源码)
再看看shiftUp的源码
继续点进去siftUpComparable
此时再回过头来看看我们放到PriorityQueue中的Child对象,他即没有自定义比较器又没有实现Comparable接口,当然报错呀!
那么好吧我们在Child类中实现Comparable接口,按年龄进行比较
如果要实现大根堆,也好办
上面我们是实现了Compable接口,那么如果我们自定义一个年龄比较器呢?
3、插入/删除/获取优先级最高的元素
函数名 | 功能介绍 |
boolean offer(E e) | 插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时 间复杂度 ,注意:空间不够时候会进行扩容 |
E peek() | 获取优先级最高的元素,如果优先级队列为空,返回null |
E poll() | 移除优先级最高的元素并返回,如果优先级队列为空,返回null |
int size() | 获取有效元素的个数 |
void clear() | 清空 |
boolean isEmty() | 检测优先级队列是否为空,为空返回true |
推荐学习:《java视频教程》
以上就是Java集合框架之PriorityQueue优先级队列的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是昏睡心情为你收集整理的Java集合框架之PriorityQueue优先级队列的全部内容,希望文章能够帮你解决Java集合框架之PriorityQueue优先级队列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复