2016-03-24 10 views
0

私のビジネスロジックでは、あるリストを別のリストに完全に置き換えたいと思います。1つの配列リストを他のリストに置き換えてください

以下のアプローチは正しいですか?

public class TestListReplacement { 

    public static void main(String[] args) { 

     List<String> values= new ArrayList<String>(); 
     values.add("a"); 
     values.add("b"); 
     values.add("c"); 
     values.add("d"); 
     values.add("e"); 
     values.add("f"); 

     List<String> valuesNew= new ArrayList<String>(); 
     valuesNew.add("g"); 
     valuesNew.add("h"); 
     valuesNew.add("i"); 
     valuesNew.add("j"); 
     valuesNew.add("k"); 

     values= valuesNew; 
     for(String val:values){ 
      System.out.println(val); 
     } 
    } 
} 

これはうまくいくようですが、使用状況によっては動作しないことがあります。 、および参照を上書きすることは常にオプションではありません :

+0

その正しいといつも動作します –

+1

あなたのコードはリストに特定の何もしていません。単に、変数のオブジェクト参照が別のオブジェクト参照で上書きされていることを示しています。既存のリスト内の値を更新しようとしている場合、それはあなたのコードがやっていることではありません。新しい値を表示するためにそのリストを参照しているコード内の他の場所が必要な場合は、それは起こりません。上記の説明と孤立したコードサンプルに基づいて、どの問題を解決しようとしているのか、そしてソリューションが機能するかどうかは明確ではありません。 – nbrooks

+1

実際、この質問はhttp://stackoverflow.com/questions/3823398/better-practice-to-re-instantiate-a-list-or-invoke-clear(およびその他の情報)の複製です。 – nbrooks

答えて

4

は、私はあなたが何をしようとして正しく理解していれば、どのような

values.clear(); // delete original contents in the list 
values.addAll(valuesNew); // insert everything in the new list 

について@nbrooksと他人からの回答からいくつかのより多くのコンテキストを追加するには率直に言えば、コレクションの2回の反復処理の認識された非効率性は、実際にはほとんど常に無関係です。同じリストインスタンスを保持する必要がある場合(コードの他の場所で参照されているため)、変数を上書きしても他の場所は更新されません。

+0

@ Jonnyリストが他のクラスのメンバである場合、後者は何の効果もありません。異なる問題にはさまざまな解決策があります。この答えは、指定されたリストのすべての値を新しい値に置き換えるのが最も簡単です。変数を上書きすると、初期の既存のリストへの他の参照を変更することはありません。 – nbrooks

+0

@nbrooksは 'clear()'時間を無駄にしていませんか?あなたはむしろ単に参照を取り除き、GCはあなたのために汚い仕事をするでしょう。 –

+0

@Debosmit彼らは提供していないOPのユースケースに依存します。参照を上書きすることは必ずしもオプションではなく、むしろ、実際には、コレクションを2回反復処理することの非効率性はほとんど無関係です。同じリストインスタンスを保持する必要がある場合(コードの他の場所で参照されているため)、変数を上書きしても他の場所は更新されません。 – nbrooks

関連する問題