0

次のようなリストがあるとしましょう。

private LinkedList<String> messages = new LinkedList<String>();

私のメソッドが初めて呼び出されると、このリストにいくつかの文字列が追加されます。また、以前に追加した値からこのリストをクリアする必要がある別の方法もあります。それをクリアするには、次を使用できます。

messages.clear();

これにより、リストからすべての要素が削除されます。また、次のように新しいインスタンスを作成できます。

messages = new LinkedList<String>();

リストをクリアするには、どちらの方法がより適切ですか?

4

8 に答える 8

3
messages.clear();

実際にリストをクリアし、新しいリスト インスタンスを参照するmessages = new LinkedList<String>();ように設定するだけmessagesなので、リスト インスタンスをクリアするには最初の方法の方が「正しい」と主張できます。

于 2012-11-28T15:45:15.123 に答える
3

2 つの変数 a と b によって参照されるリストがあるとします。このように (これほど近くにある必要はありません。別のファイルにある場合もあります..):

final List<String> a = new LinkedList<String>();
final List<String> b = a;

今、大きな違いがあります

a.clear();

これにより、 a と b の両方が同じ空のリストを参照し、

a = new LinkedList<String>();

これにより、「a」は新しい空のリストを参照し、「b」は古い、入力されたリストを参照します。(したがって、それらは同じリストを参照しません)。

おそらく同じリストを参照する必要があるため、 a.clear() が推奨されます。 b によって参照されるリストを見て驚くことはないからです (これは空であると信じているかもしれませんが、実際にはnew-approach を使用する場合は入力されます)。

于 2012-11-28T15:49:42.273 に答える
2

私は最初のアプローチを好みます。つまりmessages.clear();、要素をクリアしますが、リストは破棄および再作成されません。必要に応じて、すべての要素が削除されます。

ただし、副作用が 1 つあります。リストを繰り返し処理し、一度に 1 つの項目を削除するため、リストが巨大な場合は不要なオーバーヘッドになります。

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

同様に、2 番目のアプローチにも 1 つの副作用があります。プログラムの別の場所で r リストのオブジェクト参照を使用している場合は、それを適切に処理する必要があります。変数の場合、最初のアプローチでは、参照されたすべての場所からその要素がクリアされますが、2 番目のアプローチではクリアされません。

要約: 両方のアプローチの結果は、低レベルの性質で異なります。それらはあなたの高レベルの要件を満たしているように見えますが(リストをクリアします)。低レベルの要件に基づいて慎重に決定してください。

于 2012-11-28T15:46:50.653 に答える
1

個人的には、 LinkedList#clearを使用することを好みます。これは、コードを読むときに自分が何をしているかをより明確に理解できるためです。

しかし、それnew LinkedList<String>();もうまくいきます。だから何を使うかはあなた次第!

于 2012-11-28T15:48:05.180 に答える
1

それらはほとんど似ていますmessages.clear()が、より柔軟だと思います。

2 番目のアプローチは単純でよく使用さfinalれますが、リストに修飾子がある場合、その方法ではそれをクリアできないという問題があります。

于 2012-11-28T15:46:26.693 に答える
1
messages.clear();

より効率的です。安全性を高めるために、前にこのリストが空でないかどうかを尋ねることができます

于 2012-11-28T15:46:52.113 に答える
0

それは明らかにあなたの必要性に依存します。

リスト オブジェクト インスタンスへの参照を保持したい場合 (例として、messagesがパラメーターであるメソッド内でその clear メソッドが呼び出された場合、への呼び出し.clear()が最適なソリューションです。

一方、クリアしたいリストが、現在のメソッドがメンバーであるオブジェクトのメンバー フィールド (またはメソッド内のローカル変数) である場合は、new LinkedList<String>();問題なく呼び出すことができます。

最初のもの (私はこれを否定する傾向があります) を避けるために、私は通常、変更したオブジェクトを、それらを変更するメソッドの結果として返すことに注意してください。

于 2012-11-28T15:47:52.527 に答える
0

最初のものをお勧めします。2 番目のものは、ガベージ コレクターに余分な負担をかけます。しかし、最初のものはそうではありません。

于 2012-11-28T15:46:51.027 に答える