这个优先级队列 delMax() 方法中的一个潜在错误,是吗?

A potential bug in this prioprity queue delMax() method, is it?

这是一段 Java 代码,用于实现删除优先级队列中的最大值。

问题是Key max = pq[1],如果Key是原始类型,那么这一行真的是将pq[1]复制到max变量中。但是,如果 Key 是引用,那么在 exch()sink() 之后,这个 max 不再引用此优先级队列中的最大值(它永久引用 pq[1 ]),但第二大。我认为正确吗?

 /**
 * Removes and returns a largest key on this priority queue.
 *
 * @return a largest key on this priority queue
 * @throws NoSuchElementException if this priority queue is empty
 */
public Key delMax() {
    if (isEmpty()) throw new NoSuchElementException("Priority queue underflow");
    Key max = pq[1];
    exch(1, N--);
    sink(1);
    pq[N+1] = null;     // to avoid loiterig and help with garbage collection
    if ((N > 0) && (N == (pq.length - 1) / 4)) resize(pq.length / 2);
    assert isMaxHeap();
    return max;
}

没有。 pq[1] 指的是堆中其他地方的某个对象,在 Key max = pq[1] 之后,max 指的是同一个对象。在该点之后更改 pq[1] 不会更改 max.

更改 pq[1] 引用的 对象的 内容会更改 max 引用的对象,因为它们是同一个对象,但仅仅设置 pq[1] 来引用不同的对象不会改变 max.