Java PriorityQueue实现:为什么Object []队列而不是E []队列? " key"的目的是什么?在siftUp / siftDownComparable中?

时间:2017-06-09 02:13:50

标签: java heap openjdk

我正在研究JDK implementation of PriorityQueue

1)整个队列存储在

 transient Object[] queue;

为什么不使用通用E声明数组? (相反,在课堂上有很多人投射E。)

2)siftUpComparable / siftDownComparable方法的第一行是

    Comparable<? super E> key = (Comparable<? super E>)x;

这是一个保护条款来验证x是否具有可比性? (否则,为什么不直接使用x?)

以下是整个方法:

private void siftDownComparable(int k, E x) {
    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;
}

1 个答案:

答案 0 :(得分:3)

1)如果没有引用对象的类,则无法实例化泛型类型的数组。有关示例,请参阅下面的JavaDevil评论。但是,通过创建一个Object数组,不需要将Class的实例提供给PriorityQueue。

E[] array = new E[10]; // won't compile

2)PriorityQueue可以通过Comparable的对象compareTo()方法或使用Comparator为不一定可比较的对象对其元素进行排序。仅当创建PriorityQueue时未提供Comparator时,才会调用siftDownComparable方法。由于type参数没有规定<E extends Comparable>,因此需要显式转换它。这是siftDown()方法。

private void siftDown(int k, E x) {
    if (comparator != null)
        siftDownUsingComparator(k, x);
    else
        siftDownComparable(k, x);
}