2

リンクされたリストから重複データを削除するために Java で以下のコードを使用しています。私の質問は、current.next = null を明示的に設定することをお勧めするかどうかです。つまり、current が重複データになるため、前のノードのcurrent の next but current の隣に Java で削除されるということは、gc で使用できるようにすることを意味します。だから、本当に明示的に設定する必要がありますか?

public void removeDuplicates()
{
    HashSet<Integer> nodeSet = new HashSet<Integer>();
    Node previous = this;
    Node current = previous;
    while(current!=null)
    {
         if(!nodeSet.contains(current.data))
         {
             nodeSet.add(current.data);
             previous = current;
             current = current.next;
         }
        else
         {
             previous.next = current.next;
             current.next = null;
             current = previous.next;

         }
    }

}
4

5 に答える 5

2

current到達不能になるとすぐに、そこから到達可能なオブジェクトの違いはゼロになります。いいえ、これは必要ありません。

于 2012-07-17T20:41:17.977 に答える
2

ノードに到達できない場合、そのノードも到達不能になりnextます(親が1つしかないと仮定)

于 2012-07-17T20:39:36.900 に答える
1

いいえ!あなたは頭に釘を打ちました。とにかく、現在のnullに設定された値は、次の実行時にその値を設定したときに上書きされます。'current'は値henがある場合にのみ気にするので、使用していないときにnullに設定することを心配する必要はありません。メソッド(およびその変数)がスコープ外になると、GCはその役割を果たします。

于 2012-07-17T20:41:19.953 に答える
0

いいえ、それが悪影響を与えることはないはずです。

于 2012-07-17T20:40:46.930 に答える
0

とりわけ、標準ライブラリ コード自体によってこれが行われることがある理由は、「オブジェクトが他のオブジェクトによって指されていない場合、次の GC ステップで収集される」という根本的な仮定が最新の JVM では間違っているためです。 .

ノードが古い世代になるとすぐにcurrent、その次のポインターは若い GC 実行のルートセットの一部と見なされます。これは、リストから削除されたいくつかの若いノードも収集されない可能性があることを意味します。つまり、彼らも古い世代に入ります。最終的に、これにより古い世代が大きくなり、ルートポインタが増え、若い GC で収集されるオブジェクトが少なくなる可能性があります。すべて悪いことです。

それがついに理論であり、一部の非常に賢い人々がそれに帰するようになりました.効果が本当に顕著であるかどうかは別のことです.これについてはテストを実行していません.

于 2012-07-17T21:47:58.177 に答える