3

私は単一リンクリストを持っています

a->b->c->d->e

a、b、c、d および e はノード型のオブジェクトです。以下のコードに示すように、リストをトラバースしながらノードを削除し、その後、削除されたノードをリストの先頭にします。

list.delete(iterator, current);
list.addObjectAtFront(current);


public void delete(ListIterator li, Node node) {
    if (li == null) {
        throw new NullPointerException();
    }

    li.next();
    if (li.previous() != null) {
        li.previous().setNext(node.getNext());
    }

}

public void addObjectAtFront(Object o) {
    Node newNode = new Node(null, o);
    if (this.head != null) {
        newNode.setNext(this.head);
        this.head = newNode;
    } else {
        this.head = this.tail = newNode;
    }
}

上記のメソッドが呼び出されたときに、現在のアイテムが c であるとします。私は次のことを期待しています

list.delete(iterator, current);
Output: a->b->d->e
list.addObjectAtFront(current);
Output: c->a->b->d->e

2つの相反する考えがあります

  1. 削除された後、c は他のノードを指していないため、2 番目のメソッドが呼び出される前にガベージ コレクションを実行できます。

  2. c は、それ自体が null ではなく、データが含まれているため、ガベージ コレクションを実行できません。これは、c を使用する必要がなかった場合を意味します。記憶の中にぶらぶらし続けるだけです。

どちらが正しいですか、それとも完全に間違っているので、オブジェクト参照を新たに理解する必要がありますか?

4

3 に答える 3

3

ガベージ コレクションは、参照する方法があるメモリを削除することはありません ( WeakReferenceを使用しない限り) 。

つまり、ノードをまだ使用している場合は、Java がそのノードをガベージ コレクションすることはありません。プログラマーは、パフォーマンス向上のためでない限り、ガベージ コレクターの動作について考える必要はありません。GC はコードの正確性に影響を与えるべきではありません。

どちらが正しいですか、それとも完全に間違っているので、オブジェクト参照を新たに理解する必要がありますか?

直接答えることも、どちらもありません。削除するときは、 というノードへの参照を使用しますcurrent。この参照は c と同じ参照です。c が削除されても、それを参照している current はまだあります。次に、リストの先頭に current を追加します。これで再び 2 つの参照が作成され、スコープから削除されると現在の参照が失われ、1 つの参照に戻ります。

c はガベージ コレクションを取得しません。

于 2013-11-05T17:50:39.493 に答える