首页 >

Java集合框架之PriorityQueue优先级队列

Java|java教程Java集合框架之PriorityQueue优先级队列
java
Java-java教程
计算机考试模拟软件源码,ubuntu创建应用图标,tomcat访问修改名字,nutch爬虫 微博,让电脑中毒的php源码,seo的元素lzw
《java视频教学》
桔子云源码,vscode单词翻译,ubuntu移除硬盘,tomcat布署项目,sqlite_id,微信公众号插件库,web如何搭建前端框架,简易影视爬虫,php -,淘宝seo 优化,仿《今日头条》网站程序,网页后台可视化编辑,angularjs 网站模板,静态网页页面,启明星 会议管理系统,五克商城小程序后台管理系统lzw
priorityQueue在Java集合框架中的关系如下:
Java集合框架之PriorityQueue优先级队列
java ftp服务器源码,ubuntu软件163源,tomcat日志打印在哪里,爬虫获取软件,php 引用文件技巧,沙洋县seo关键词排名优化厂家lzw
A、使用PriorityQueue的注意点

1. 使用时必须导入PriorityQueue所在的包,即:

2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出
ClassCastException异常

3. 不能插入null对象,否则会抛出NullPointerException

4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容

5. 插入和删除元素的时间复杂度为log以2为底的n

6. PriorityQueue底层使用了堆数据结构

7. PriorityQueue默认情况下是小堆—即每次获取到的元素都是最小的元素(想要变成大堆,需要我们重新比较方法、默认的比较方法是Comparable接口中的compareTo方法)

B、PriorityQueue常用接口介绍1. 优先级队列的构造

此处只是列出了PriorityQueue中常见的几种构造方式,其他的大家可以参考帮助文档。

构造器功能介绍
PriorityQueue()创建一个空的优先级队列,默认容量是11
PriorityQueue(int
initialCapacity)
创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异
PriorityQueue(Collection<?
extends E> c)
用一个集合来创建优先级队列
PriorityQueue(Comparator comparator)创建具有默认初始容量的优先级队列,并根据指定的比较器对其元素进行比较
PriorityQueue(int initialCapacity, Comparator comparator)

创建一个初始容量为initialCapacity的优先级队列,根据指定的比较器对其元素进行比较

注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异

2、PriorityQueue中对元素的比较

看完了构造方法,我们重新来思考一个问题

优先级队列是如何实现有序的呢?因为优先级队列就是借助小根堆来实现的

在实现小根堆的过程我们知道这其中一定发生了元素的比较,所以PriorityQueue中的元素必须要能够比较大小,那么PriorityQueue是如何进行元素的比较呢?

Java集合框架之PriorityQueue优先级队列

我们看到这里程序报错了,为什么呢?因为我们插入的Child对象是不可比较的(即没有实现Comparable接口又没有采用自定义的比较器)

可以看到

Java集合框架之PriorityQueue优先级队列

即我们采用了默认的比较方法Comparable接口中的compareTo方法

Java集合框架之PriorityQueue优先级队列

此时我们再次看一下报错信息

Java集合框架之PriorityQueue优先级队列看来是在往PriorityQueue中插入元素的时候出现了问题

那么我们打开PriorityQueue的源码看一下(下面是PriorityQueue中offer方法的源码)

Java集合框架之PriorityQueue优先级队列

再看看shiftUp的源码

Java集合框架之PriorityQueue优先级队列

继续点进去siftUpComparable

Java集合框架之PriorityQueue优先级队列

此时再回过头来看看我们放到PriorityQueue中的Child对象,他即没有自定义比较器又没有实现Comparable接口,当然报错呀!

那么好吧我们在Child类中实现Comparable接口,按年龄进行比较

如果要实现大根堆,也好办

Java集合框架之PriorityQueue优先级队列

上面我们是实现了Compable接口,那么如果我们自定义一个年龄比较器呢?

3、插入/删除/获取优先级最高的元素

函数名功能介绍
boolean
offer(E e)
插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时
间复杂度 ,注意:空间不够时候会进行扩容
E peek()获取优先级最高的元素,如果优先级队列为空,返回null
E poll()移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size()获取有效元素的个数
void
clear()
清空

boolean

isEmty()

检测优先级队列是否为空,为空返回true

《java视频教学》


  • 暂无相关文章
  • Posted in 未分类