特点
- 优先级队列是无界的(默认容量为11:DEFAULT_INITIAL_CAPACITY = 11),最大可以达到 Integer.MAX_VALUE ,容量不够会使用grow(size)方法实现扩容
- 线程不安全,对应的线程安全类:PriorityBlockingQueue 类
- 不允许为 null
- PriorityQueue默认的是维持一个小顶堆
- 自定义的对象要实现 Comparator接口(维持小顶堆,要比较对象的大小)
适合用来解决的问题:
1、求解一个数组中的找出第K大的值得问题,
2、找出一个数组中最大的K个值
添加元素:
- add(E e)方法: 实际上调用的offer() 方法
public boolean add(E e) {
return offer(e);
}
- offer(E e)方法
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
if (i >= queue.length)
grow(i + 1);
siftUp(i, e);
size = i + 1;
return true;
}
维持小顶堆的方法 :
private void siftUp(int k, E x) {
if (comparator != null)
siftUpUsingComparator(k, x, queue, comparator);
else
siftUpComparable(k, x, queue);
}
删除节点 poll() 和 remove() 方法
poll() 每次删除的是小顶堆的堆顶元素(最小的元素),这个代价是非常大的(是伪删除),每次回冲最底层的叶子节点选择一个值替换根节点得值,然后再调整堆的顺序,删除叶子节点
remove(Object o)
public E poll() {
final Object[] es;
final E result;
if ((result = (E) ((es = queue)[0])) != null) {
modCount++;
final int n;
final E x = (E) es[(n = --size)];
es[n] = null;
if (n > 0) {
final Comparator<? super E> cmp;
if ((cmp = comparator) == null)
siftDownComparable(0, x, es, n);
else
siftDownUsingComparator(0, x, es, n, cmp);
}
}
return result;
}