这篇文章主要讲解了“Java集合框架之PriorityQueue优先级队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合框架之PriorityQueue优先级队列实例分析”吧!Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueuepriorityQueue在Java集合框架中的关系如下:
1. 使用时必须导入PriorityQueue所在的包,即:import java.util.PriorityQueue2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出
ClassCastException异常3. 不能插入null对象,否则会抛出NullPointerException4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容5. 插入和删除元素的时间复杂度为log以2为底的n6. PriorityQueue底层使用了堆数据结构7. PriorityQueue默认情况下是小堆—即每次获取到的元素都是最小的元素(想要变成大堆,需要我们重新比较方法、默认的比较方法是Comparable接口中的compareTo方法)此处只是列出了PriorityQueue中常见的几种构造方式,其他的大家可以参考帮助文档。创建一个初始容量为initialCapacity的优先级队列
,根据指定的比较器对其元素进行比较注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常看完了构造方法,我们重新来思考一个问题优先级队列是如何实现有序的呢?因为优先级队列就是借助小根堆来实现的在实现小根堆的过程我们知道这其中一定发生了元素的比较,所以PriorityQueue中的元素必须要能够比较大小,那么PriorityQueue是如何进行元素的比较呢?PriorityQueue采用了:
Comparble和Comparator两种方式。1. Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接口,并覆写compareTo方法2. 用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并覆写compare方法。我们看到这里程序报错了,为什么呢?因为我们插入的Child对象是不可比较的(即没有实现Comparable接口又没有采用自定义的比较器) 可以看到 即我们采用了默认的比较方法Comparable接口中的compareTo方法此时我们再次看一下报错信息看来是在往P免费云主机域名riorityQueue中插入元素的时候出现了问题 那么我们打开PriorityQueue的源码看一下(下面是PriorityQueue中offer方法的源码)再看看shiftUp的源码继续点进去siftUpComparable此时再回过头来看看我们放到PriorityQueue中的Child对象,他即没有自定义比较器又没有实现Comparable接口,当然报错呀!那么好吧我们在Child类中实现Comparable接口,按年龄进行比较如果要实现大根堆,也好办上面我们是实现了Compable接口,那么如果我们自定义一个年龄比较器呢?booleanisEmty()
感谢各位的阅读,以上就是“Java集合框架之PriorityQueue优先级队列实例分析”的内容了,经过本文的学习后,相信大家对Java集合框架之PriorityQueue优先级队列实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
本文小编为大家详细介绍“C#如何使用selenium实现爬虫”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何使用selenium实现爬虫”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Selenium 是一个用于Web应用程序…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。