PriorityQueue
优先队列是一种容器,它可以使得其第一个元素始终是它包含的最大元素,通过堆排序进行实现的。
先看看用的什么数据结构存储的信息
transient Object[] queue;
嗯?又是数组。
PriorityQueue
来我们看一个添加元素的方法,add–>offer–>siftUp–>siftUpUsingComparator或siftUpComparable
所以它实现优先队列的方法是在添加元素后,对维护的数组进行一次最小堆排序。
public boolean add(E e) {
return offer(e);
}
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
if (i >= queue.length)
grow(i + 1);
size = i + 1;
if (i == 0)
queue[0] = e;
else
siftUp(i, e);
return true;
}
private void siftUp(int k, E x) {
if (comparator != null)
siftUpUsingComparator(k, x);
else
siftUpComparable(k, x);
}
private void siftUpUsingComparator(int k, E x) {
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (comparator.compare(x, (E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = x;
}
其他的方法与普通队列没有太多区别