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

PriorityQueue讲解 PriorityQueueJava中一个非常常用的数据结构,它可以实现基于优先级的排序,常用于任务调度、事件处理等场景。本文将深入探讨JavaPriorityQueue的底层实现与源码分析,帮助读者更好地理解PriorityQueue的内部原理。本文将从PriorityQueue的定义、特性入手,逐步分析其底层实现、源码解析以及应用场景案例、优缺点分析等方面,全面深入地理解PriorityQueue 阅读详情
    private void initFromPriorityQueue(PriorityQueue<? extends E> c) {
        if (c.getClass() == PriorityQueue.class) {
            this.queue = c.toArray();
            this.size = c.size();
        } else {
            initFromCollection(c);
        }

    }

这个是本类初始化的方法 

判断参数是不是PriorityQueue类型的 

如果是就将参数转换成数组 赋给queue属性 将参数的size赋给size属性

否则就调用initFromCollection方法 初始化队列


    private void initElementsFromCollection(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if (a.getClass() != Object[].class)
            a = Arrays.copyOf(a, a.length, Object[].class);
        int len = a.length;
        if (len == 1 || this.comparator != null)
            for (int i = 0; i < len; i++)
                if (a[i] == null)
                    throw new NullPointerException();
        this.queue = a;
        this.size = a.length;
    }

首先将参数转换成数组赋给临时变量a 

判断a的类型不是Object数组的话

调用Arrays的copyOf方法将a转换成Object数组 然后将元素重新复制给a

获取a的长度len 判断len为1或comparator属性为空 

进入for循环遍历每个元素 判断有空元素就抛出异常

将a赋给queue属性 将a的长度赋给size属性

    private void initFromCollection(Collection<? extends E> c) {
        initElementsFromCollection(c);
        heapify();
    }

这个方法是用Collection参数初始化队列的方法

调用上面那个方法初始化队列元素

调用heapify方法进行数组建堆

   private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

最大数组长度为int的最大值减八


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

相关推荐

JavaPriorityQueue的用途和性能深度剖析

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

喵手的博客 1406

深浅克隆之Arrays.copyOf()

Arrays.copyOf()是数组的复制,那么Arrays.copyOf()实现的是深克隆还是浅克隆呢? 我们先来看看什么是深克隆,什么是浅克隆? 首先我们要明确的是,不管是深克隆还是浅克隆,克隆后都会在堆内存空间中开辟一块新地址来存储克隆后的对象,有区别的只是对于原型对象中成员变量是基本数据型、String型和引用型的不同处理 浅克隆 浅克隆(Shadow Clone)是把原型对象中成员...

can_chen的博客 2052

Java PriorityQueue源码深入剖析

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

weixin_36282234的博客 875

弄清Java深浅拷贝问题(一) ! 相关【System.arraycopy()方法、Arrays.copyOf()和Arrays.copyOfRan等】

https://stackoverflow.com/questions/38641495/java-implement-deep-and-shallow-copy-of-an-array 链接里讨论的很清楚,总结结论就是: 1. java api 的拷贝方法都是浅拷贝,即arraycopy()方法、clone() 方法、copyOf()和copyOfRan等都是浅拷贝 2. 深浅拷贝讨论的是数组元素为对象!! 也就是我们说的第一条这些方法对于对象数组,都是浅拷贝啊! 深浅拷贝不适用于讨论数组元素为..

ftfy123的博客 373

Arrays.copyOf() 方法理解

Arrays.copyOf() 用法: Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。 copyOf()的第个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如: 代码块: import java.util.Arrays; public class ArrayDemo { public static ...

Spider_007 1906

java集合大家族之Collection(List、Queue、Set)

集合简介如果你想保存一组对象,数组是个很好的选择,但是数组具有固定的尺寸。在一般的情况中,你在写程序时并不知道将需要多个对象,或者是否需要更复杂的方式来存储对象,因此数组尺寸固定这一限制显得过于受限制了。java库中提供了一套相当完整的容器来解决这个问题,其中基本的型是List、Set、Queue和Map,这些对象型也称为集合java容器都可以自动调整自己的尺寸。因此,与数组不同,在编

2059

详解Java中的Arrays的copyOf()方法

Java中的Arrays的copyOf()方法 @SuppressWarnings("unchecked") public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } 这个方法就是取出传入数组的class对象作为第三个参数,调用适用性更广的另一个函数而已. public static <

qq_45376284的博客 2043

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

这是优先队列  public class PriorityQueue extends AbstractQueue implements java.io.Serializable 这是的描述 继承自 AbstractQueue 实现了Serializable接口     private static final int DEFAULT_INITIAL_CAPACITY = 11;

ccdust的博客 296

共同学习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()的使用及源码分析

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

书生-w的博客 1万+

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

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

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

ccdust的博客 248

Java源码分析》:BlockingQueue之PriorityQueue

PriorityQueue相关属性介绍1、默认容量2、最大容量3、叉堆//基于叉堆来实现优先队列,queue[i]的子节点为queue[2*i+1]/queue[2*i+2];4、优先队列元素个数5、比较器,优先队列中的元素就是按照此比较器进行排序。PriorityQueue相关构造函数介绍1)、创建一个优先队列对象,默认大小为11,队列中的元素按照自然顺序排序。2)、创建一个指定大小的优先队列对象,队列中的元素按照自然顺序排序。

smart_an的专栏 927
上一篇: 共同学习Java源代码-数据结构-PriorityQueue类(一)
下一篇: 共同学习Java源代码-数据结构-PriorityQueue类(三)
达霁吧
博客等级 码龄15年 61粉丝 168原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值