优先级队列:PriorityQueue常用接口+构造+方法+源码分析+OJ练习

news/2024/5/20 5:58:47 标签: 数据结构, java, , 优先级队列

文章目录

  • PriorityQueue常用接口
    • 一.PriorityQueue 的特性
    • 二.PriorityQueue常用接口介绍
      • 1.优先级队列的构造
      • 2.插入/删除/获取优先级最高的元素
      • 3.PriorityQueue的扩容方式:


PriorityQueue常用接口


一.PriorityQueue 的特性

  • 1.Java集合框架中提供了 **PriorityQueue **和 **PriorityBlockingQueue **两种类型的优先级队列
  • 2.PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的

在这里插入图片描述

PriorityQueue底层由实现,由数组构造

java">import java.util.PriorityQueue;   
public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>();
        //直接实例化对象
        Queue<Integer> priorityQueue2 = new PriorityQueue<>();//默认是小根
        //用接口来调用
    }
  • 3.使用时必须导入PriorityQueue所在的包
  • 4.PriorityQueue中放置的元素,必须要能够比较大小,否则会抛出类型转换ClassCastException异常
java">        priorityQueue2.offer(new Student(12));
        priorityQueue2.offer(new Student(32));//ClassCastException,没有指定比较的元素,对象本身无法比较

在这里插入图片描述

  1. PriorityQueue的offer方法,用的是向上调整,siftUp里面,用到了Comparator和Comparable方法
  2. 要比较大小就要先实现Comparator和Comparable
  • 5.不能插入null对象,否则会抛出空指针异常NullPointerException
  • 6.内部会自动扩容
  • 7.插入和删除元素的时间复杂度为 O ( log2N )
  • 8.PriorityQueue底层使用了数据结构,默认是小根

二.PriorityQueue常用接口介绍

1.优先级队列的构造

在这里插入图片描述

  • PriorityQueue() 不带参数的构造方法

创建一个空的优先级队列

调用无参构造器,初始容量默认为11,默认没有构造器

  • PriorityQueue(int initialCapacity)

默认没有构造器

创建一个初始容量为initialCapacity的优先级队列,initialCapacity不能小于1,否则会抛IllegalArgumentException异常

  • PriorityQueue(Collection<?extends E> c)

用一个集合来创建优先级队列

  • PriorityQueue队列是小,如果需要大需要提供比较器
java">// 用户自己定义的比较器:直接实现Comparator接口,然后重写该接口中的compare方法即可

2.插入/删除/获取优先级最高的元素

函数名功能介绍
boolean offer(E e)插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常时间复杂度O ( log2N )
E peek()获取优先级最高的元素,如果优先级队列为空,返回null
E poll()移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size()获取有效元素的个数
void clear()清空
boolean isEmpty()检测优先级队列是否为空

3.PriorityQueue的扩容方式:

在这里插入图片描述

1.如果容量小于64时,是按照oldCapacity的2倍方式扩容

2.如果容量大于等于64,是按照oldCapacity的1.5倍方式扩容的

3.如果容量超过MAX_ARRAY_SIZE,按照MAX_ARRAY_SIZE来进行扩容

点击移步博客主页,欢迎光临~

偷cyk的图


http://www.niftyadmin.cn/n/5154656.html

相关文章

String的几个常见面试题及其解析

String s3 new String("a") new String("b")会不会在常量池中创建对象&#xff1f; 答案&#xff1a;不会&#xff0c;首先需要解释“”字符串拼接的理解。 采用 运算符拼接字符串时&#xff1a; 如果拼接的都是字符串直接量&#xff0c;则在编译时编…

Java面向对象(进阶)-- super关键字的使用与子类对象实例化全过程

文章目录 一、super关键字的使用&#xff08;1&#xff09;为什么需要super&#xff1f;&#xff08;2&#xff09;super的理解&#xff08;3&#xff09;super可以调用的结构1、super调用方法举例1举例2举例3小结 2、super调用属性举例1举例2举例3小结 3、super调用构造器引入…

梳理自动驾驶中的各类坐标系

目录 自动驾驶中的坐标系定义 关于坐标系的定义 几大常用坐标系 世界坐标系 自车坐标系 传感器坐标系 激光雷达坐标系 相机坐标系 如何理解坐标转换 机器人基础中的坐标转换概念 左乘右乘的概念 对左乘右乘的理解 再谈自动驾驶中的坐标转换 本节参考文献 自动驾驶…

多线程JUC 第2季 多线程的内存模型

一 内存模型 1.1 概述 在hotspot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为3个部分&#xff1a;对象头&#xff1b;实例数据&#xff0c;对齐填充。如下所示&#xff1a;

proxy 属性与方法

proxy 属性与方法实例 proxy 属性与方法 proxy 是 JavaScript 中的一个内置对象&#xff0c;它提供了一种机制来拦截并自定义对象的基本操作。 通过使用 proxy&#xff0c;我们可以在对象上定义自定义行为&#xff0c;例如拦截属性访问、函数调用、构造函数调用等。 proxy 对…

YOLOv8独家首发改进:黑夜小目标检测,ICANN会议出品,原创LEF模块,增强图像增强组成

💡本篇内容:YOLOv8独家首发改进:ICANN会议出品,黑夜小目标检测,原创LEF模块,增强图像增强组成 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv8专属 黑夜小目标检测论文理论部分…

Python--快速入门二

Python--快速入门二 1.Python数据类型 1.可以通过索引获取字符串中特定位置的字符&#xff1a; a "Hello" print(a[3]) 2.len函数获取字符串的长度&#xff1a; a "Hello" print(a) print(len(a)) 3.空值类型表示完全没有值&#xff1a; 若不确定当…

“网站不安全”该如何解决

当我们的网站被客户访问的时候&#xff0c;经常会出现提示不安全的情况&#xff0c;导致客户的不信任&#xff0c;从而出现客户流失的现象&#xff0c;这种情况我们应该如何解决呢&#xff1f; 首先&#xff0c;我们要确定网站会出现不安全的原因&#xff0c;一般来说&#xff…