深入理解 PriorityQueue 优先队列
最近在使用DelayQueue时候,发现其底层是基于PriorityQueue实现的,接着这个机会深入分析一下优先队列的实现原理,方便以后在最适合的地方应用。
本文主要的结构分为以下几点:
1)PriorityQueue的类继承关系
2)PriorityQueue的核心数据结构以及数据结构实现原理
3)PriorityQueue的核心方法以及实现原理
4)PriorityQueue应用场景以及测试案例
PriorityQueue的类继承关系
优先队列的类继承关系相对简单,主要是主要是实现了两个接口:Collection和Queue,类继承图如下:
PriorityQueue的核心数据结构(最小堆)
核心属性
首先我们先来看看PriorityQueue的核心成员属性:
transient Object[] queue;// 队列使用数组保存数据
private int size = 0;//队列的大小
/** 队列里面的元素使用的比较器,如果不指定,就是用元素自己默认的比较器。PriorityQueue就是通过这个比较器来实现排序 */
private final Comparator<? super E> comparator;
从成员变量我们可以知道以下几点:
- 优先级队列使用数据保存数据
- PriorityQueue里面元素的有序性是通过一个比较器实现的
核心构造器
我们再看看构造器,这里只列出几个核心的构造器:
public PriorityQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
public PriorityQueue(int initialCapacity) {
this(initialCapacity, null);
}
public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator) {
// Note: This restriction of at least one is not actually needed,
// but continues for 1.5 compatibility
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initial