Java容器之PriorityQueue源码分析(附堆的调整图解)

  PriorityQueue容器,翻一下就是优先队列,平常一般称优先队列的作用是将队列中的元素最小值放到堆顶小顶堆,最小的元素在顶端,你也可以修改comparator,使之变成大顶堆,最大的元素在顶端)。每当我们插入删除元素,都是从堆顶进行,优先队列会自动重新调整,将最小的元素值调整到堆顶

  本篇博客将从源码的角度并结合相应的图解,对Java中的PriorityQueue容器的实现原理进行分析。为了帮助大家更好的理解PriorityQueue,写了一篇关于堆的实现与原理分析博客,墙裂推荐各位小伙伴阅读做铺垫,链接→数据结构之堆(我猜,关于堆的这些维护细节,你肯定不清楚,不信你来看!)

注明:以下源码分析都是基于jdk 1.8.0_221版本
在这里插入图片描述

一、PriorityQueue容器概述

  PriorityQueue类的申明如下:

public class PriorityQueue<E> extends AbstractQueue<E>
    implements java.io.Serializable

在这里插入图片描述
  Java中的PriorityQueue容器,底层是通过数组来实现堆结构。在前一篇博客数据结构之堆(我猜,关于堆的这些维护细节,你肯定不清楚,不信你来看!)说过,基于数组实现的堆两个重要规律:

  1. 下标为index的左、右孩子的下标分别是index * 2 + 1(index + 1) * 2
  2. 堆中有子节点的节点最大下标为 size / 2 - 1(注意:size为堆的大小,不是数组的大小)

在这里插入图片描述

二、PriorityQueue类中的主要属性

/**
 * 数组默认初始化的长度
 */
private static final int DEFAULT_INITIAL_CAPACITY = 11;

/**
 * 实现堆的数组
 */
transient Object[] queue; // non-private to simplify nested class access

/**
 * 优先队列中的元素数(注意需要与数组的长度区分开)
 */
private int size = 0;

/**
 * 优先队列中元素比较器,通过指定comparator,可以选择构造小顶堆还是大顶堆
 */
private final Comparator<? super E> comparator;

/**
 * 结构性调整(插入、删除、扩容等操作)的次数
 */
transient int modCount = 0;

三、PriorityQueue类的构造器

/**
 * 默认构造器,数组长度初始化为默认值
 */
public PriorityQueue() {
   
    this(DEFAULT_INITIAL_CAPACITY, null);
}

/**
 * 指定数组的初始化长度
 */
public PriorityQueue(int initialCapacity) {
   
    this(initialCapacity, null);
}

/**
 * 指定元素比较器
 */
public PriorityQueue(Comparator<? super E> comparator) {
   
    this(DEFAULT_INITIAL_CAPACITY, comparator);
}

/**
 * 数组长度、元素比较器都指定
 */
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) {
   
    // 数组长度不能小于1
    if (initialCapacity < 1)
        throw new IllegalArgumentException();
    this.queue = new Object[initialCapacity];
    this.comparator = comparator;
}

/**
 * 复制构造器1
 * 将容器1中的元素全部放入当前创建的优先队列中
 */
@SuppressWarnings("unchecked")
public PriorityQueue(Collection<? extends E> c) {
   
    if (c instanceof SortedSet<?>) {
   
    	// 如果容器C是SortedSet接口实现类,可初始化comparator
        SortedSet<? extends E> ss = (SortedSet<? extends E>) c;
        this.comparator = (Comparator<
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值