队列是一种先进先出的数据结构。而在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级(或者最低)的元素首先被删除。今天我们来了解一下,Java中为我们实现了优先队列的类PriorityQueue。
在了解PriorityQueue之前,我们要了解一下我们一种数据结构-堆。堆呢,通常是一个可以被看做一棵完全二叉树的数组对象。除了是一颗完全二叉树,堆还总满足一个条件:堆中某个节点的值总是不大于(大根堆)或不小于(小根堆)其父节点的值。
什么是完全二叉树呢,假设二叉树的深度为n,除了第 n 层外,其它各层的结点数都达到最大个数也就是2n-1,第n层所有的结点都连续集中在最左边,这就是完全二叉树。如下图所示:

小根堆:如上图所示,子节点总数大于根节点,最小值就是根节点。
大根堆:如下图所示,子节点纵小于根节点,最大值就是根节点。

看做完全二叉树的数组对象,怎么理解呢。如果将完全二叉树进行广度优先遍历的值,依次存入一个数组就是我们这个二叉树对应的数组。比如上面的完全二叉树转为数组表示就是[100,19,36,17,3,25,1,2,7]。这个数组可以表示成一个完全二叉树,也就是我们的大根堆。堆的实现我们一般都用数组表示,但记住它其实代表的一颗完全二叉树。
堆的概念我们就介绍到这里,不做深究,下面我们来看看我们今天的主角PriorityQueue,它的本质其实就是堆的实现(大根堆,小根堆)。下面我们通过PriorityQueue源码,来分析一下它的实现和使用,我们先假设元素值越小优先级越高。(具体优先级大小是通过实现了Comparable接口对象的compareTo方法或者自定义的Comparator比较器决定的)。
一.构造方法:
private static final int DEFAULT_INITIAL_CAPACITY = 11;
public PriorityQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
public PriorityQueue(int initialCapacity,Comparator<? super E> comparator) {
// Note: This restriction of at least one is not actually needed,
// but continues for 1.5 compatibility
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initialC

本文深入剖析Java中的PriorityQueue类,探讨其内部实现原理,包括堆结构、插入与删除操作的复杂度,以及如何确保高优先级元素始终位于队列前端。
最低0.47元/天 解锁文章
553

被折叠的 条评论
为什么被折叠?



