java中PriorityBlockingQueue的入队知识点总结
在PriorityBlockingQueue中添加元素同样有四种方法,因为是树状的结构,所以在插入方法上也有所变化,是自下而上的操作过程。在入队的规则上有三个要点需要我们注意。鉴于PriorityBlockingQueue入队方法主要通过offer(E)实现,所以我们就这种方法作主要讲解。
1.入队规则
(1)默认的插入规则中,新加入的元素可能会破坏小顶堆的性质,因此需要进行调整。
(2)调整的过程为:从尾部下标的位置开始,将加入的元素逐层与当前点的父节点的内容进行比较并交换,直到满足父节点内容都小于子节点的内容为止。
(3)默认的删除调整中,首先获取顶部下标和最尾部的元素内容,从顶部的位置开始,将尾部元素的内容逐层向下与当前点的左右子节点中较小的那个交换,直到判断元素内容小于或等于左右子节点中的任何一个为止。
2.入队方法
入队方法有:add(E), put(E), offer(E, timeout, TimeUnit), offer(E)
public void put(E e) { offer(e); // never need to block } public boolean offer(E e) { //判断是否为空 if (e == null) throw new NullPointerException(); //显示锁 final ReentrantLock lock = this.lock; lock.lock(); //定义临时对象 int n, cap; Object[] array; //判断数组是否满了 while ((n = size) >= (cap = (array = queue).length)) //数组扩容 tryGrow(array, cap); try { //拿到比较器 Comparator<? super E> cmp = comparator; //判断是否有自定义比较器 if (cmp == null) //堆上浮 siftUpComparable(n, e, array); else //使用自定义比较器进行堆上浮 siftUpUsingComparator(n, e, array, cmp); //队列长度 +1 size = n + 1; //唤醒休眠的出队线程 notEmpty.signal(); } finally { //释放锁 lock.unlock(); } return true; }
可以看出前三个方法内部都是通过 offer(e) 方法实现的。
相关文章
spring使用Filter过滤器对Response返回值进行修改的方法
这篇文章主要介绍了spring使用Filter过滤器对Response返回值进行修改,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-09-09最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的详细步骤
idea开发工具一直是java环境最好用,很受广大开发者喜爱,今天通过本文给大家分享最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的详细步骤,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下2021-06-06SpringBoot项目部署时application.yml文件的加载优先级和启动脚本问题
Spring Boot在启动时会根据一定的优先级顺序加载配置文件,优先级从高到低依次是:命令行参数、Jar包外部config目录下的配置文件、Jar包同级目录下的配置文件、classpath下的/config目录、classpath根路径2024-09-09
最新评论