Queue接口下的PriorityQueue

Queue接口

Queue实质就是队列。其下有不同的Queue实现类,用的方式上是不同的。

Queue接口下有以下子接口:BlockingDeque,BlockingQueue和Deque。BlockingQueue用于多线程,这里主要讲PriorityQueue。

队列的性质:先进先出(FIFO)

Queue接口除了实现了Collection接口下提供的方法,还提供了特殊的方法(详见常用方法中的表格)。

PriorityQueue

特点

  • 数据是可以重复的
  • 不能存储null值
  • 集合数据按照一定的优先级进行排序的(集合内部是不能进行排序的,只能保证队列头部是最小或者最大的)

PriorityQueue我们称之为优先级队列,优先级队列能让每次取出的值都是最小的(这里是自然排序)
如果想取出的都是最大的,可以通过比较器定义进行排序。

PriorityQueue的底层数据结构是堆存储是基于数组实现的,它的有序性是基于堆或完全二叉树实现的。堆顶元素永远是最小的(自然排序)或者最大的(比较器定义)。

PriorityQueue是线程不安全的,会抛出ConcurrentModificationException的异常。

对于二叉树我们知道这样的关系:源码解析处详细解释
(leftNode :左孩子节点;rightNode :右孩子节点;parentNode :父节点;Nodenum:节点序号)

  • leftNode = parentNode*2+1
  • rightNode = parentNode*2+2
  • parentNode = (Nodenum-1)/2

PriorityQueue源码解析

继承关系
public class PriorityQueue<E> extends AbstractQueue<E>
	implements java.io.Serializable

PriorityQueue继承自AbstractQueue抽象类,实现了Serializable接口,可以进行序列化。

属性
//存放元素的数组
transient Object[] queue;
//支持比较操作
private final Comparator<? super E> comparator;
默认值
//默认初始容量为11
private static final int DEFAULT_INITIAL_CAPACITY = 11;
//初始元素个数
private int size = 0;
//版本控制器,用于抛出ConcurrentModificationException
transient int modCount = 0;
//默认数组最大长度
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
构造方法
//无参构造方法,默认容量为11
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){
   }
//有参构造方法,可以将Collection接口下的集合放入
public PriorityQueu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值