源码角度详解Java中的优先队列PriorityQueue(堆的实现)

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

队列是一种先进先出的数据结构。而在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级(或者最低)的元素首先被删除。今天我们来了解一下,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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值