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) 方法实现的。

(0)

相关推荐

  • java中PriorityBlockingQueue的入队知识点总结

    在PriorityBlockingQueue中添加元素同样有四种方法,因为是树状的结构,所以在插入方法上也有所变化,是自下而上的操作过程.在入队的规则上有三个要点需要我们注意.鉴于PriorityBlockingQueue入队方法主要通过offer(E)实现,所以我们就这种方法作主要讲解. 1.入队规则 (1)默认的插入规则中,新加入的元素可能会破坏小顶堆的性质,因此需要进行调整. (2)调整的过程为:从尾部下标的位置开始,将加入的元素逐层与当前点的父节点的内容进行比较并交换,直到满足父节点内容

  • java中基本注解的知识点总结

    1.java.lang.Override是一个标记类型注解,它被用作标注方法.他说明了该方法是继承了父类的方法,就是重写了父类中同名方法. @Override public void onCreate(Bundle savedInstanceState) {--.} 这种写法是正确的,如果你写成: @Override public void oncreate(Bundle savedInstanceState) {--.} 编译器会报如下错误:The method oncreate(Bundle

  • Java中的重要核心知识点之继承详解

    目录 一.继承 1.概念 2.语法 3.父类成员的访问 (1)子类中访问父类成员变量 (2)子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.super和this 7.代码块执行顺序 8.父类成员在子类中的可见性 9.继承方式 10.final关键字 11.组合 一.继承 1.概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的

  • java中的方法重载知识点总结

    什么是方法的重载? 方法重载是以统一的方式处理不同数据类型的一种手段. 怎样构成方法的重载? 方法名相同, 形参不同.而形参的不同又表示在: 1). 形参的个数不同 2). 形参的类型不同 3). 形参的顺序不同方法的重载主要是结局同一个方法,但参数不同的问题 举一个例子,比较两个整数的大小 和比较两个浮点数的大小 public class Testmax { /** 主方法 */ public static void main(String[] args) { int i = 5; int j

  • Java中的Valid和Validated的比较内容

    如果要添加接口校验,需要 1,在接口方法中请求参数前面添加@Valid注解,不需要在接口的实现类上添加@Valid注解,也不需要@Validated注解: addAnimal(@Valid Animal a) 2,在请求对象类的每个要校验的字段上添加@Valid注解,也不需要在类上添加@Validated注解: public class Animal{ @Valid @NotEmpty private String name; } Validated是Spring对javax.validatio

  • java中堆内存与栈内存的知识点总结

    一.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 二.堆内存 1.什么是堆内存? 堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放. 2.堆内存的特点是什么? 第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队,好,你先买票. 第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,

  • Java中equals()知识点总结

    经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结. 1.equals的本意--即在Object对象中定义的equals()方法有什么样的意义. (此处先附上==的作用,后面仍有叙述.因为==和equals()方法的关系是很密切的,后面有我自己的看法. ==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型,如果两个值相同,则结果为true 而在比较引用时,如果引用指向内存中的同一对象,结果为true) public boolean equals(Objec

  • java中Hibernate面试知识点整理

    作为常用的框架之一,Hibernate在面试的时候难免会被问到.好在涉及的都是一些理论方面的知识点,比如概念.原理.使用之类的.我们在面试之前可以针对这方面的题目,做一个充足的准备,即使有些人对hibernate框架的了解并不深入.下面我们就hibernate框架中常见的面试题带来介绍. 1. 为什么要使用 hibernate? (1).对JDBC做了轻量级的封装,简化了数据访问层编码. (2).Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便. (3)

  • java中面向对象的概念及知识点总结

    作为java中的一个重要理念,说起面向对象也是老生常谈了.在找资料的时候多是很专业的术语,又或者很多框架的知识点合集,其实大部分人刚看资料的时候是不能理解的.本篇对面向对象的一些基础概念进行介绍,尽量以通俗的语言展现给大家,分为概念.好处.与面向过程区别和最重要的三大特征. 1.概念 面向过程是以函数为基础,完成各种操作,强调过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.设计和开发程序的好处 (1)交流更加流畅 (2)提高设计和

  • java中Class类的基础知识点及实例

    1.说明 Class本身也是一个类. Class对象只能由系统确定. JVM中只有一个Class实例可以加载一个类. Class对应于JVM中加载的.class文件. 每一类的实例都会记住它是由哪个Class例子产生的. 通过Class,可以完全获得一个类中所有加载的结构. Class是Reflection的根源.对于任何你想动态加载和运行的类,只有先获得相应的Class对象. 2.实例 package com.volcano.reflection; import java.lang.annot

随机推荐