目录
PriorityQueue
优先级队列(priority queue)中的元素可按照任意的顺序插入,却总是按照排序的顺序进行检索。优先级队列使用堆(heap)数据结构实现。---摘自《Java核心技术 卷1》
注:PriorityQueue底层实现是以数组为基础的一个最小堆的数据结构,重点包括:泛型,堆的Heapify操作。
PriorityQueue继承关系
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractQueue<E>
↳ java.util.PriorityQueue<E>
PriorityQueue继承及依赖图
构造函数
public PriorityQueue()
public PriorityQueue(int initialCapacity)
public PriorityQueue(Comparator<? super E> comparator)
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
public PriorityQueue(Collection<? extends E> c)
public PriorityQueue(PriorityQueue<? extends E> c)
public PriorityQueue(SortedSet<? extends E> c)
常用API
方法名 | 功能描述 |
add(E e) | 添加元素 |
clear() | 清空 |
contains(Object o) | 检查是否包含当前参数元素 |
offer(E e) | 添加元素 |
peek() | 读取元素,(不删除) |
poll() | 取出元素,(删除) |
remove(Object o) | 删除指定元素 |
size() | 返回长度 |
泛型的比较
前提条件:此泛型类参数必须继承Comparable接口,如java.lang.Integer
代码示例:比较(E) x和(E) e的大小。
Comparable<? super E> key = (Comparable<? super E>) x;
key.compareTo((E) e);// >=0:x>=e; <0:x<e;
最小堆维护(MIN-HEAPIFY)
add操作最小堆维护(siftUp),k:插入位置,x:插入数据
private void siftUpComparable(int k, E x) {// Java PriorityQueue Source
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}
poll操作最小堆维护(siftDown),k:取出位置,x:末尾数据,这边是堆常用的,取出索引0的数据,然后将末尾数据填充上去,并删除末尾数据,size-1
private void siftDownComparable(int k, E x) {// Java Priority Source
Comparable<? super E> key = (Comparable<? super E>)x;
int half = size >>> 1; // loop while a non-leaf
while (k < half) {
int child = (k << 1) + 1; // assume left child is least
Object c = queue[child];
int right = child + 1;
if (right < size &&
((Comparable<? super E>) c).compareTo((E) queue[right]) > 0)
c = queue[child = right];
if (key.compareTo((E) c) <= 0)
break;
queue[k] = c;
k = child;
}
queue[k] = key;
}
注:由最小堆的性质可见,PriorityQueue取出的数据是从小到大的。