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

PriorityQueue讲解 PriorityQueueJava中一个非常常用的数据结构,它可以实现基于优先级的排序,常用于任务调度、事件处理等场景。本文将深入探讨JavaPriorityQueue的底层实现与源码分析,帮助读者更好地理解PriorityQueue的内部原理。本文将从PriorityQueue的定义、特性入手,逐步分析其底层实现、源码解析以及应用场景案例、优缺点分析等方面,全面深入地理解PriorityQueue 阅读详情
    public Iterator<E> iterator() {
        return new Itr();
    }
这个是迭代器方法 

    private final class Itr implements Iterator<E> {

这个是实现了迭代器接口的内部迭代器类

        private int cursor = 0;

这个是迭代光标

        private int lastRet = -1;

这个是最近一次返回的元素在数组中的下标

        private ArrayDeque<E> forgetMeNot = null;

这个表示迭代过程中 一部分没有访问到的元素放在这里 等正常迭代完成 再迭代这里

        private E lastRetElt = null;

上一次访问的元素

        private int expectedModCount = modCount;
迭代器的修改次数 和 外部类的修改次数同步

        public boolean hasNext() {
            return cursor < size ||
                (forgetMeNot != null && !forgetMeNot.isEmpty());
        }
这个是判断是否还剩余元素的方法 判断光标是否小于size或forgetMeNot是否不为空

        @SuppressWarnings("unchecked")
        public E next() {
            if (expectedModCount != modCount)
                throw new ConcurrentModificationException();
            if (cursor < size)
                return (E) queue[lastRet = cursor++];
            if (forgetMeNot != null) {
                lastRet = -1;
                lastRetElt = forgetMeNot.poll();
                if (lastRetElt != null)
                    return lastRetElt;
            }
            throw new NoSuchElementException();
        }

这个是迭代下一个元素的方法

先判断如果两个修改次数不一致 就抛出并发异常 

判断如果光标小于size 就返回数组的下一个元素 光标自增后赋给lastRet 

判断如果forgetMeNot不为空

lastRet赋为-1 lastRetElt赋为forgetMeNot的第一个元素 并且从这个双向队列中删除第一个元素 判断这个元素不为空就返回

最后如果没有下一个元素了 就抛出异常

        public void remove() {
            if (expectedModCount != modCount)
                throw new ConcurrentModificationException();
            if (lastRet != -1) {
                E moved = PriorityQueue.this.removeAt(lastRet);
                lastRet = -1;
                if (moved == null)
                    cursor--;
                else {
                    if (forgetMeNot == null)
                        forgetMeNot = new ArrayDeque<>();
                    forgetMeNot.add(moved);
                }
            } else if (lastRetElt != null) {
                PriorityQueue.this.removeEq(lastRetElt);
                lastRetElt = null;
            } else {
                throw new IllegalStateException();
            }
            expectedModCount = modCount;
        }

    }

最后是迭代删除的方法

先判断两个修改次数是否一致 不一致就抛出并发异常

如果lastRet不为-1 说明队列还在遍历 就调用外部类的removeAt方法 将lastRet处的元素删除 并赋给临时变量moved

将lastRet设为-1

判断moved为空 光标自减 如果moved不为空 就判断forgetMeNot是否为空 为空就创建新的双向队列实例 将moved放进去 其实这个forgetMeNot就是个垃圾桶 

 如果lastRet为-1 单lastRetElt不为空 就调用外部类的方法删除这个对象 

如果上述判断都不成立就抛出异常

最后将两个修改次数统一

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

相关推荐

Java PriorityQueue源码深入剖析

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

weixin_36282234的博客 875

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

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

ccdust的博客 297

oracle11隐藏参数调整

oracle11隐藏参数调整

共同学习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的博客 276

Java——PriorityQueue

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

Ghost In Matrix 2496

PriorityQueue 源码分析

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

xindoo 2570

产业园区如何构建数据驱动的科技服务体系?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

本资源来源于vector官方知识库,KB0016980-Panel控件CAPL-Output-View与HexText-Edit

本资源来源于vector官方知识库,KB0016980_Panel控件CAPL_Output_View与HexText_Editor的区别及用法

国央企如何提升技术创新与成果转化效率?.docx

国央企如何提升技术创新与成果转化效率?

国有企业如何提升科技创新能力与决策支持水平?.docx

国有企业如何提升科技创新能力与决策支持水平?

如何助力高校科技成果转化效率提升?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

网神SecAV3600防毒墙系统用户手册Word(257页).doc

智慧方案是面向IT全行业打造的数字化落地支撑体系,依托物联网、大数据、人工智能等技术,覆盖小程序开发、智能安防、能源数字化、农机智慧管理等细分垂直场景,跳出通用模板的空泛框架,从业务痛点出发搭建从需求调研到上线运维的全链路执行路径,是技术人员排查项目问题、撰写合规标书、推进数据治理的实用工具。想精准匹配自己细分领域的专属IT智慧方案,直接进入找方案知识星球,垂直赛道专属方案库随查随用,不用在零散资料里反复筛选,快速拿到能直接落地的参考内容。

ASP.NET毕业设计含文档和代码ASP某公司进销存信息管理系统的设计与实现(源代码+论文)

ASP.NET毕业设计含文档和代码ASP某公司进销存信息管理系统的设计与实现(源代码+论文)

master-ip-online-change

自动切换脚本

ASP.NET毕业设计含文档和代码ASP企业物流平台的设计与实现(源代码+论文)

ASP.NET毕业设计含文档和代码ASP企业物流平台的设计与实现(源代码+论文)

CAD+说明书履带拖拉机变速器改进设计Ⅳ

CAD+说明书履带拖拉机变速器改进设计 Ⅳ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值