## download:Vue3 从入门到实战 进阶式掌握完整知识体系
一、前言
之前我们有讲到栈与队列,在 java中栈的类是 Stack,队列的接口是 Queue,并且我们通过队列的实现类 LinkedList对队列的方法进行了练习,并使用通过相关的知识完成了 LeetCode 232题 怎么用栈实现队列
了解的都知道,我这么不思进取的人怎么可能突发奇想的去了解一个工作中没用过的类,不出意外的,还是在今天做 LeetCode 347. 前 K 个高频元素题的时候,尝试了几次都不知道怎么做,看评论区发现这道题实际上应该是使用 优先级队列 来做,我才知道有优先级队列这么个东西
但是优先级队列,有的编程语言中并没有,好在 java是有的,实现优先级队列的类是 PriorityQueue,顾名思义, Priority就是优先级的意思
俗话说的好,很多东西都是你用到了才会去了解,那么今天我就和大家一起把玩把玩这个优先级队列吧
二、PriorityQueue
由于我没有下载 java8的源码,进入 PriorityQueue类里面有大量的英文注释,不方便截图,所以下面我会直接放代码
什么是优先级队列
队列我们都知道,放入元素就是放在了队尾,拿取元素就是拿取队头的元素,也就是我们常说的先进先出,那么优先级队列是什么?和队列又有什么不同?能解决什么样的问题呢?
优先级队列,依旧是 顾名思义,优先级队列会自动按照元素的权值排列,也就是说,优先级队列其实有反 先进先出规则,但是其对外接口依旧是从队头取元素,队尾添加元素,再无其他存取方式,看起来就是一个队列
优先级队列其实是一个 披着队列外皮的堆
什么是堆?
堆通常可以被看成一个完全二叉树的数组对象,树中的每个节点都不小于(或不大于)其左右孩子的值
如果父节点大于左右孩子的值,那么是大顶堆
如果父节点小于左右孩子的值,那么是小顶堆
优先级队列的特点
优先级队列里的元素必须实现内部比较器或者外部比较器
优先级队列拥有小顶堆的所有特性, 默认是 小顶堆
优先级队列不是线程安全的
不允许使用 null元素
优先级队列本身是无序的,但是取出的元素所排成的序列才是有序序列
关于特点部分来源于百度,有问题的话及时评论指正,谢谢
基本属性
// 序列化相关,可以忽略
private static final long serialVersionUID = -7720805057305804111L;
// 默认无参构造时数组的长度
private static final int DEFAULT_INITIAL_CAPACITY = 11;
// 存储元素的数组队列
transient Object[] queue;
//
private int size = 0;
// 集合排序策略
private final Comparator<? super E> comparator;
//
transient int modCount = 0;