在jdk中,自带了一个优先级队列,scheduledThreadPoolExecutor自己内部也实现了一个优先级队列
我们先不考虑jdk是如何实现的,其实让我们自己去实现一个优先级队列的实现的话,完全可以这样来做:
在入队的时候,根据当前key对应的hash值,或者是根据自己的特定的比较规则,从第一个元素开始对比,如果当前要入队的元素优先级小于队列中的第一个key,就插入到前面,反之,继续往后去对比,这样就可以实现一个简单的优先级队列,在每次取出来第一个元素的时候,就是优先级最高的
所以:对于优先级队列来说,最为重要的就是:优先级的比较规则
PriorityQueue
那来看下PriorityQueue在入队的时候,是怎么做的
// 这是存储元素的数据结构
transient Object[] queue; // non-private to simplify nested class access
// 这是规则比较器,其实就是来比较哪个优先级高,哪个优先级低
private final Comparator<? super E> comparator;
入队方法
我们来看下offer入队方法
public boolean offer(E e) {
// 1.如果入队的元素为null,抛出异常
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
// 2.如果当前元素个数大于等于数组长度,就扩容
if (i >= queue.length)
grow(i + 1);
size = i + 1;
// 3.如果数组为空,是第一个入队的元素,就直接放到第一个位置即可,无需比较
if (i == 0)
queue[0] = e;
else
// 4.否则,就需要进行优先级的比较
siftUp(i, e);
return true;
}
和其他队列唯一的区别是:这里多了一个优先级比较的步骤
接着来看下是如何进行优先级的排序的
优先级比较
private void siftUp(int k, E x) {
if (comparator != null)
siftUpUsingComparator(k, x);
else
siftUpComparable(k, x);
}