前言

今天复习算法时,发现优先队列有些忘记了,就去研究了下优先队列的源码,写个小笔记,加深下理解。

PriorityQueue

优先队列

我们知道队列是FIFO(先进先出)的,而优先队列的每一个元素都有一个对应的优先级,所以优先队列最前面的元素是优先级最高或者优先级元素最低的元素。

优先队列保留了队列的基本性质,优先队列其实可以看成堆,这样更加好理解。

java中优先队列的声明

在java中,是有已经封装好的优先队列供我们调用的,即PriorityQueue

PriorityQueue<Integer> queue = new PriorityQueue<Integer>();

这样声明的优先队列的值就默认为优先队列的优先级了。

优先队列插入和删除元素的时间复杂度为O(log2N)

当我们需要声明一个带初始容量的优先队列时,我们可以直接在声明的后面加上我们想要的容量,比如我们声明一个50的容量。

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(50);

按优先级排序

在默认情况下,不传入Comparator对象的话,Java会默认按优先级从小到大排序,即一个小顶堆,就是按优先级从小到大的队列,队首是优先级最小的元素。

那假如我们想要一个队首是最大优先级的元素时,我们需要怎么设置呢

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});

常见方法

private void grow(int minCapacity)

这个方法可以增加优先队列的容量

private void grow(int minCapacity) {
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity < 64 ? oldCapacity + 2 : oldCapacity >> 1
/* preferred growth */);
queue = Arrays.copyOf(queue, newCapacity);
}

public boolean offer(E e)

插入一个元素e,如果e为空,会抛出NullPointerException,如果队列的容量满了,会自动扩容。插入成功返回true

public E poll()

弹出一个优先级最高或者最低(取决于你的设置),如果优先队列为空,返回null

public int size()

返回当前优先队列的个数

public void clear()

清空当前队列

public void clear() {
modCount++;
final Object[] es = queue;
for (int i = 0, n = size; i < n; i++)
es[i] = null;
size = 0;
}

public E peek()

获取队首元素

public E peek() {
return (E) queue[0];
}

public boolean isEmpty()

检查优先队列是否为空,空就返回true

总结

简单常见的一些方法,如果有什么问题,希望大佬指教。

java优先队列PriorityQueue的更多相关文章

  1. Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节

    目录 Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节 优先队列的默认用法-从小到大排序 对String类用优先队列从大到小排序 通过自定义比较器对自定义的类进行从小到大 ...

  2. 【Java源码】集合类-优先队列PriorityQueue

    一.类继承关系 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...

  3. Java Collection - PriorityQueue 优先队列

    总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...

  4. Java的优先队列PriorityQueue详解

    一.优先队列概述 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序, 可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类 对于基本数据类型的包装器 ...

  5. Java优先队列

    按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...

  6. java中PriorityQueue优先级队列使用方法

    优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...

  7. 《转》JAVA中PriorityQueue优先级队列使用方法

    该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最 ...

  8. 【转】java中PriorityQueue优先级队列使用方法

    优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...

  9. java,优先队列的用法

    像C++语言一样,java中,也有包装好的优先队列类PriorityQueue. 用法如下(模板代码): 工作安排问题: 问题描述:设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij. ...

  10. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

    转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...

随机推荐

  1. centos安装k8s

    1.确保每台机器上有docker http://get.daocloud.io/#install-docker 2.关闭 每台机器上的swap,selinux swapoff -a setenforc ...

  2. Spring MVC 常见问题

    Spring MVC的主要组件有那些? spring mvc 在使用 DispatcherServlet 处理 web 请求的时候,会用到 spring 中的九大组件,以下是几个关键的组件: 1.Li ...

  3. Linux完全卸载mysql的方式

    //rpm包安装方式卸载查包名:rpm -qa|grep -i mysql删除命令:rpm -e –nodeps 包名 //yum安装方式下载1.查看已安装的mysql命令:rpm -qa | gre ...

  4. python多线程获取线程执行结果

    In [1]: from threading import Thread def fun(t): """ //执行函数体 //t:时间 """ ...

  5. HAL层分析

    1. 安卓HAL模块基本 2. 定义hal层代码的5个特性 1)硬件抽象层具有与硬件的密切相关性. 2) 硬件抽象层具有与操作系统无关性. 3) 接口定义的功能应该包含硬件或者系统所需硬件支持的所有功 ...

  6. RBAC学习(一)

    0.前提 :用户只有一个直属部门,但角色可以关联多个部门 有一种情况就不太适用:比如说地区经理是一个角色,张三是北京市地区经理,他在组织架构中的直属部门是华北大区,然后一个黑龙江的销售李四提一个折扣申 ...

  7. Windows命令行备份文件

    windows命令行备份文件 0 前言 前段时间,笔者因为在C盘爆满的情况下被windows自动更新了(大概),出现了以下情况: 在试了几种方法后不起作用,无奈下只能重装系统. 在这之前要把之前的一些 ...

  8. 集训第二周计划:把cf近期的div2除了最后一题给切完

    太菜了太菜了,弄个训练计划. 晚上没事干的时候我想把博客园皮肤改一下,搜着搜着不知道怎么回事点进去一些竞赛选手的博客,比如这个 https://www.cnblogs.com/soda-ma/p/13 ...

  9. 基于 RocketMQ Connect 构建数据流转处理平台

    本文作者:周波,阿里云智能高级开发工程师, Apache RocketMQ Committer . 01 从问题中来的RocketMQ Connect 在电商系统.金融系统及物流系统,我们经常可以看到 ...

  10. 跳出思维的“盒子”,聊聊 RTE 应用创新大赛的那些作品

    由声网Agora 与环信联合主办的"RTE 2021 编程挑战赛"已圆满落幕.在今年的大赛中,来自行业中不同领域的专家参与了决赛评选,包括 Linux 中国技术社区技术负责人 白宦 ...