java的优先级队列使用方法,java实现优先队列
这篇文章带给你一些关于java的知识,包括关于PriorityQueue的知识。Java集合框架中有两种优先级队列:PriorityQueue和PriorityBlockingQueue。PriorityQueue是线程不安全的,而PriorityBlockingQueue是线程安全的。下面就让我们一起来看看,希望对你有所帮助。
如何解决写爬虫IP受阻的问题?立即使用。
Java集合框架中priorityQueue的关系如下:
:
一、使用PriorityQueue的注意点
1.使用时,必须导入PriorityQueue所在的包,即:
2.放在优先级队列中的元素必须能够比较大小,不能比较大小的对象不能插入,否则会被抛出。
ClassCastException异常
3.不能插入null对象,否则会抛出NullPointerException。
4.没有容量限制,可以插入任意数量的元素,其内部容量可以自动扩展。
5.时间复杂度为log以2为底的n用于插入和删除元素
6.堆数据结构用在优先级队列的底部
7.默认情况下,PriorityQueue是一个小堆——也就是说,获得的每个元素都是最小的元素(想要变成大堆,需要我们重新比较方法、默认的比较方法是Comparable接口中的compareTo方法)
二、PriorityQueue常用接口介绍
1. 优先级队列的构造
此处仅列出PriorityQueue中常见的几种构造方式。其他请参考帮助文档。
Ken0@166.com:
2、PriorityQueue中对元素的比较
看完施工方法,再来重新思考一个问题。
优先级队列是如何排序的?因为优先级队列是由小根堆实现的。
在实现小根堆的过程中,我们知道必须有元素比较,所以PriorityQueue中的元素必须能够比较大小。那么PriorityQueue如何比较元素呢?
我们看到这里的程序报告了一个错误。为什么?因为我们插入的子对象不具有可比性(即没有实现Comparable接口又没有采用自定义的比较器)
能看见
即我们采用了默认的比较方法Comparable接口中的compareTo方法
现在让我们再来看看错误消息。
看来是在往PriorityQueue中插入元素的时候出现了问题
然后我们打开PriorityQueue的源代码看一下(下面是PriorityQueue中offer方法的源码)
看看shiftUp的源代码。
继续点击,siftUpComparable
此时,让我们回头看看放在PriorityQueue中的子对象。当然他即没有自定义比较器又没有实现Comparable接口,给出错误!
好吧,让我们在子类中实现Comparable接口来按年龄进行比较。
如果我们想实现大根桩,很容易做到。
上面我们已经实现了Compable接口,那么如果我们定制一个年龄比较器呢?
3、插入/删除/获取优先级最高的元素
推荐在
函数名 | 功能介绍 |
boolean offer(E e) | 插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时 间复杂度 ,注意:空间不够时候会进行扩容 |
E peek() | 获取优先级最高的元素,如果优先级队列为空,返回null |
E poll() | 移除优先级最高的元素并返回,如果优先级队列为空,返回null |
int size() | 获取有效元素的个数 |
void clear() | 清空 |
boolean isEmty()
| 检测优先级队列是否为空,为空返回true |
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。