2

私はjava.util.LinkedListのソースコードを読んでいました。私は興味をそそるデザインの選択に気付きました。これは.clear()メソッドから引き出され、リンクリストのすべての要素を繰り返してメモリからすべて削除します。私の質問は、なぜxを直接代入するのではなく、変数を次に定義するのでしょうか?その要素をコピーするのに時間がかかりませんか?少なくとも、その範囲内では一時的により多くのスペースを必要とします。変数を直接割り当てるか一時的に保存する方が速いのですか?

for (Node<E> x = first; x != null;) { 
    Node<E> next = x.next; 
    x.item = null; 
    x.next = null; 
    x.prev = null; 
    x = next; 
} 
+1

トラバーサルをクリアする前に 'x.next'を保存する必要があるためです。あなたが提案するものはうまくいかないでしょう。 – EJP

+0

ところで、明示的にリストを明確にする理由を知りたい人は、http://stackoverflow.com/questions/575995/clear-impl-in-javas-linkedlistを参照してください。 – ykaganovich

答えて

0

これは実際には必要です。なぜアルゴリズムが必要なのかを示すために、アルゴリズムとコードを説明します。この質問には複雑なトピックが含まれているので、私の答えは初心者の方がより理解できるように少し書かれています。

まず、オブジェクトを使用するときにJVM内で実際に何が起こっているのかを理解することが重要です。 Javaでは、オブジェクト(プリミティブ型は含まれていないことに注意してください)は、実際には使用されません。代わりに、我々はの参照をオブジェクトに使用しています。オブジェクトは単にそのオブジェクトのポインタです。これを行うことで、メモリの割り当て/割り当て解除について心配することはありません。オブジェクトが不要になったときにオブジェクトが確実に削除されるようにするために、すべてのオブジェクトは、現在のプログラム状態で参照されている回数をカウントします。概して、あるオブジェクトを使用するスコープを入力するとき、そのオブジェクトの参照カウントはスコープを入力してインクリメントされ、スコープから離れるにつれてデクリメントされます。オブジェクトが0参照に達すると、現在、このオブジェクトを使用するプログラムの部分がないことを意味します。したがって、安全に削除できます。これは、ガベージコレクションの仕組みを簡単にまとめただけですが、最終的にはより複雑です。

この方法は、反復リストの各項目の上に起こっている、とその現在のノードの各項目、Xを間接参照も参照を有します。これは、オブジェクトアイテムことを言っていない、とXは、これらのオブジェクトに対して持つ唯一の参照、nullに設定する必要があります。これは、オブジェクトに0の参照がある場合、このオブジェクトを安全にガベージコレクトできます。我々はx.nextにそれを割り当てられた前

for (Node<E> x = first; x != null;) { 
    x.item = null; 
    x.prev = null; 
    x = x.next; 
} 

次にノードXはまだ明らかにされx.next、への参照を保持:あなたは、このようなここのように、提案されたように、私たちは何をするならばxが削除された/削除されたとしても、そのオブジェクトがメモリ内で浮遊し続けるため、不要です。

どちらが早いかという質問に答えるには、意味がありません。はい、その範囲では、変数を作成するために数バイトを保存します。ですが、実際には新しいオブジェクトをインスタンス化しているわけではないため、参照を作成するだけですJVMで最適化されています)。この次のオブジェクトはスタック上に一時的に割り当てられます。そのスタックはループの次の繰り返しで上書きされるため、メモリ使用に関する懸念も生じません。

+0

より速い質問に答えるには意味がありません。それらのうちの1つだけが動作するときは、速度に関して2つのものを比較することはできません。 – EJP

関連する問題