共同学习Java源代码-数据结构-PriorityQueue类(一)

PriorityQueue讲解 PriorityQueueJava个非常常用的数据结构,它可以实现基于优先级的排序,常用于任务调度、事件处理等场景。本文将深入探讨JavaPriorityQueue的底层实现与源码分析,帮助读者更好地理解PriorityQueue的内部原理。本文将从PriorityQueue的定义、特性入手,逐步分析其底层实现、源码解析以及应用场景案例、优缺点分析等方面,全面深入地理解PriorityQueue 阅读详情

这是优先队列 

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

这是类的描述 继承自 AbstractQueue 实现了Serializable接口


    private static final int DEFAULT_INITIAL_CAPACITY = 11;

默认初始长度为11


    transient Object[] queue;

队列的基础存储结构 就是数组


    private int size = 0;

队列中元素数目


   private final Comparator<? super E> comparator;

Comparator属性 为队列排序用的


    transient int modCount = 0;

修改次数


    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) {
        if (initialCapacity < 1)
            throw new IllegalArgumentException();
        this.queue = new Object[initialCapacity];
        this.comparator = comparator;
    }

最后一个构造方法注入了两个属性 一个是数组 一个是Comparator 上面其他的构造方法都是变相调用最后一个


    @SuppressWarnings("unchecked")
    public PriorityQueue(Collection<? extends E> c) {
        if (c instanceof SortedSet<?>) {
            SortedSet<? extends E> ss = (SortedSet<? extends E>) c;
            this.comparator = (Comparator<? super E>) ss.comparator();
            initElementsFromCollection(ss);
        }
        else if (c instanceof PriorityQueue<?>) {
            PriorityQueue<? extends E> pq = (PriorityQueue<? extends E>) c;
            this.comparator = (Comparator<? super E>) pq.comparator();
            initFromPriorityQueue(pq);
        }
        else {
            this.comparator = null;
            initFromCollection(c);
        }
    }

这个构造方法接收一个Collection参数

先判断参数是不是SortedSet 如果是就将参数强转为SortedSet 然后获取SortedSet的Comparator 然后调用initElementsFromCollection方法用SortedSet类型参数初始化队列

判断参数是否属于PriorityQueue 也就是自身类型 如果是的话 强转为自身类型 获取自身类型的Comparator 然后调用initFromPriorityQueue方法用自身类型初始化队列

参数为其他情况 将Comparator设为空 意味着默认不排名 调用initFromCollection方法初始化队列


    @SuppressWarnings("unchecked")
    public PriorityQueue(PriorityQueue<? extends E> c) {
        this.comparator = (Comparator<? super E>) c.comparator();
        initFromPriorityQueue(c);
    }

这个构造方法接收一个自身类型的参数 获取参数的Comparator 赋给自身的Comparator 调用initFromPriorityQueue初始化队列

    @SuppressWarnings("unchecked")
    public PriorityQueue(SortedSet<? extends E> c) {
        this.comparator = (Comparator<? super E>) c.comparator();
        initElementsFromCollection(c);
    }

这个构造方法传入一个SortedSet参数 

和上面类似 不多说了







PriorityQueue详细解读 PriorityQueueJava个非常常用的数据结构,它可以实现基于优先级的排序,常用于任务调度、事件处理等场景。本文将深入探讨JavaPriorityQueue的底层实现与源码分析,帮助读者更好地理解PriorityQueue的内部原理。本文将从PriorityQueue的定义、特性入手,逐步分析其底层实现、源码解析以及应用场景案例、优缺点分析等方面,全面深入地理解PriorityQueue 阅读详情

相关推荐

JavaPriorityQueue的用途和性能深度剖析

在开发中,我们经常需要对元素进行排序,并且可以快速访问最小或最大元素。这个时候,就成了我们的不二选择。是个基于优先级堆的无界优先级队列。根据不同的构造函数,可以将定义为小根堆和大根堆。本文将重点介绍Java中的。我们将深入探讨的用法,它的优缺点,以及些常见的应用场景,最主要的还是会通过实例结合知识点给大家侧面剖析,理论结合实践,以保障大家能够理解的更为透彻。可以被认为是个数组,但它具有些额外的限制。首先,的大小是固定的,而且只能在初始化的时候设置。其次,

喵手的博客 1406

Java集合】Queue源码

Java集合】Queue源码

keeper42的博客 461

Java PriorityQueue源码深入剖析

Java中实现优先级队列的个接口,其底层是基于最小堆的数据结构。该数据结构的特点在于,每个元素都有个优先级属性,用于决定元素的存储顺序。使得我们可以高效地获取到具有最高优先级(即队列头部)的元素,而不需要遍历整个集合。它是无界的,但是由于内部使用数组实现,因此在极端情况下可能会因为内存不足而导致异常。

weixin_36282234的博客 875

java集合(十)---Queue与PriorityQueue、Deque源码解析

、Queue与PriorityQueue、Deque的图如下所示: (1)从上图可以看出,Queue接口有两个实现PriorityQueue与Deque (2)ArrayDeque是Deque的个典型的实现 二、Queue: Queue是什么? (1)Queue是具有队列特性的接口 (2)Queue具有“先进先出(FIFO)”的特性 (3)Queue所有新元素都插入队列的末尾,移除元素...

chen772209的博客 423

priorityQueue 源码学习

概念 PriorityQueue 个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)PriorityQueue 队列的头指排序规则最小那哥元素。如果多个元素都是最小值则随机选个。 Pr...

hhhhhhhhh的博客 268

Java入门提高篇】Day33 Java容器详解(十五)PriorityQueue详解

  今天要介绍的是基础容器(为了与并发容器区分开来而命名的名字)中的另个成员——PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所耳闻吧,什么?没。。没听过?emmm。。。那就更该认真看看了。   通过本篇你将了解到:   1、PriorityQueue是什么?   2、PriorityQueue的内部结构是什么?   3、二叉堆、大顶堆、小顶堆分...

weixin_30853329的博客 186

共同学习Java源代码-数据结构-PriorityQueue()

private void initFromPriorityQueue(PriorityQueue c) {         if (c.getClass() == PriorityQueue.class) {             this.queue = c.toArray();             this.size = c.size();         } else {  

ccdust的博客 242

Java 数据结构PriorityQueue()的使用及源码分析

Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue

书生-w的博客 1万+

共同学习Java源代码-数据结构-PriorityQueue()

private void heapify() {         for (int i = (size >>> 1) - 1; i >= 0; i--)             siftDown(i, (E) queue[i]);     } 这个方法是堆化的方法 我现在才搞明白PriorityQueue的存储方式是用数组存储二叉树 0下标为根节点 2n+1下标为左节点 2n+2下标为右节

ccdust的博客 275

Java——PriorityQueue

PriorityQueue是基于优先级堆的极大优先级队列。

Ghost In Matrix 2496

PriorityQueue 源码分析

学过数据结构的人应该对Queue 队列很熟悉了,队列是种先进先出(FIFO)数据结构,所以它出队列的优先级就是进入队列的次序。但我们有时候需要其它的优先级,很多高级语言都会提供带优先级的队列,在Java中就是PriorityQueue了,今天我们来看下PriorityQueue的使用和实现。 使用 PriorityQueue的使用很简单,如下。 public static void m...

xindoo 2570

java priorityqueue详解_java如何使用PriorityQueue

、概述我如何PriorityQueue对我想要的东西进行排序?另外,offer和add方法之间有区别吗?二、详解使用构造函数重载,该重载采用aComparator super E> comparator并传递个比较器,该比较器以适合您的排序顺序的方式进行比较。如果您举个如何排序的例子,如果您不确定,我们可以提供些示例代码来实现比较器。(虽然非常简单。)正如其他地方所说:offer和a...

weixin_30624767的博客 653

PriorityQueue源码解析

所在包package java.util;继承AbstractQueue 实现java.io.Serializablepublic class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable { // 内部代码下面讲解 }五个变量 private static final long s

水滴石穿 1998

共同学习Java源代码-数据结构-PriorityQueue()

private void grow(int minCapacity) {         int oldCapacity = queue.length;         int newCapacity = oldCapacity + ((oldCapacity                                          (oldCapacity + 2) :    

ccdust的博客 246

共同学习Java源代码-数据结构-PriorityQueue()

privatevoid siftUp(intk, E x) {        if (comparator != null)            siftUpUsingComparator(k, x);        else            siftUpComparable(k, x);}这是siftUp方法 判断comparator属性是否为空如果不为空就调用siftUpUsingCo

ccdust的博客 275

PriorityQueue详解(

Java SE 5.0中,引入了些新的Collection API,PriorityQueue就是其中的个。今天由于机缘巧合,花了个小时看了下这个的内部实现,代码很有点意思,所以写下来跟大家分享下。从中也可以看到,Java源代码的OpenSource对于我们程序员编程带来了多大的帮助。 最初的起因是我阅读文档不仔细,使用PriorityQueue出现了问题。我刚开始只是把...

diaoyu6664的博客 130

共同学习Java源代码-数据结构-PriorityQueue()

public boolean remove(Object o) {         int i = indexOf(o);         if (i == -1)             return false;         else {             removeAt(i);             return true;         }     } 这

ccdust的博客 248

共同学习Java源代码-数据结构-PriorityQueue()

public Iterator iterator() {         return new Itr();     } 这个是迭代器方法      private final class Itr implements Iterator { 这个是实现了迭代器接口的内部迭代器         private int cursor = 0; 这个是迭代光标         pr

ccdust的博客 261
上一篇: 共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十六)
下一篇: 共同学习Java源代码-数据结构-PriorityQueue类(二)
达霁吧
博客等级 码龄15年 61粉丝 168原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值