1

私はアルゴリズムのコースでQueueの実装のコードを調べていて、作者が使用したdequeue()のコードを観察しました:

private Node first, last;

private class Node {
    String item;
    Node next;
}

public boolean isEmpty() {
    return first == null;
}

// Code segment in doubt
public String dequeue() {
    String item = first.item;
    first = first.next;
    if (isEmpty()) last = null;
    return item;
}

ここで、当然のことながら、 firstlastは、それぞれキューの最初と最後の要素を指しています。著者が使用するdequeue()のコードについては、少し懐疑的です。以来、彼は単にやっている:

first = first.next;

first.nextnullに割り当てずに。JVM のガベージ コレクション メカニズムを妨げるダングリング リファレンス (または徘徊) を残しませんか? 私は少し混乱しています。代わりにdequeue()のコードを次のようにすべきではありませんか? (C/C++ ではコードが次のようになることは確かですが、この場合の Java の予想される動作を知りたいです)

public String dequeue() {
    Node old;
    old = first;
    first = first.next;
    old.next = null;
    if (isEmpty()) last = null;
    return old.item;
}

また、誰かがこのトピックを詳細に説明し、良い例を示したリソースを教えてくれれば幸いです。

4

4 に答える 4

2

はガベージ コレクションの準備ができているため (割り当てにより最後のライブ参照が (終了すると) 削除されます)、ガベージ コレクターはその参照をトレースしないため、設定old.next = nullは不要です。oldfirst = first.nextdequeue

于 2013-05-20T15:47:01.150 に答える