优先的含义
PriorityQueue 中,会保证数组中第一个元素是数组的最大值,对于其他的元素大小顺序并不保证。
怎么加进去的
private static <T> void siftUpComparable(int k, T x, Object[] es) {
Comparable<super T> key = (Comparable<super T>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = es[parent];
if (key.compareTo((T) e) >= 0)
break;
es[k] = e;
k = parent;
}
es[k] = key;
}
这里对外提供了两个加入的接口 add & offer。最终的都是调用的上面的代码。k
就是当前数组的末尾索引,x
就是要加进来的索引,es
就是当前的数组。这里没有指定比较器,就是使用的默认比较方法(Comparable接口的实现类都会有比较大小的方法)。
(k-1)>>>1 代表什么呢?也就是无符号右移一位,也就是除以2。由于数组索引为0,所以-1也就那么回事。所以为什么最后的名称是parent,也就可以解释了。
那么进入判断
if (key.compareTo((T) e) >= 0) break;
e就是当前数组中包含的值,所以如果要插入的key >= e,那么不用考虑,直接让key在下面呆着吧,他上不去。
如果是key<e呢,说明这个e需要把位置让给key,因为他更大。那么e就是放到了key的位置。key当然也不是一定就在e原来的位置,因为循环还没有结束。
最终key把比他大的全部搞下去,他上位了!所以说最后只有第一个元素是最小的,其他元素无序。