あるArrayListの内容を別のArrayListにコピーするにはどうすればよいですか?


85

いくつかのデータ構造があり、1つを一時的なものとして使用し、もう1つを一時的ではないものとして使用したいと思います。

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

もちろん、これに関する問題は、myObject実際にはを指しているだけなmyTempObjectので、一度myTempObjectクリアされると、もクリアされmyObjectます。

JavamyTempObjectmyObject使用して値を保持するにはどうすればよいですか?


を使用できますList.addAll。ただし、すべてのオブジェクトを保持する必要がある場合、一時リストをクリアしても、実際には大量のメモリがクリアされるわけではありません。参照をクリアしようとしているだけなので、オブジェクトを保持しようとしている限りです。
Bhesh Gurung 2011

私の知る限り、この回答はまだ有効です:stackoverflow.com/questions/715650/…–
ホーム

2
あなたが本当に達成しようとしていることを解釈するのは難しいです。あなたは自分の状況を説明する必要があります。
Bhesh Gurung 2011

回答:


141

あなたはそのようなトリックを使うことができます:

myObject = new ArrayList<Object>(myTempObject);

または使用する

myObject = (ArrayList<Object>)myTempObject.clone();

ここでclone()メソッドに関する情報を入手できます。

ただし、これらすべての方法で、すべての要素ではなく、リストのコピーが提供されることを覚えておく必要があります。したがって、コピーしたリストの要素の1つを変更すると、元のリストでも変更されます。


7
Javaでの値による代入は、プリミティブ型(int、byte、charなど)およびリテラル用に予約されているものです。Javaに派生したものをコピーするように明示的に指示しない限り、Object常に参照によって割り当てられます。ちなみに、clone()浅いコピーであり、含まれているものをコピーするのObjectsではなく、それらへの参照をコピーします。ディープコピーを作成したい場合は、stackoverflow.com
questions / 64036 /…をご覧ください

@ PeterT-Javaは、値によってのみ呼び出され、割り当てられます。非プリミティブ型の変数には、割り当てられるか渡される参照値が含まれます
ブライアンローチ2011

なぜできないのですoldList = newListか?
x09 2017年

2
@ X09 oldList = newListはnewListの参照をoldListにコピーし、newListの変更はoldListにも反映されます。これは意図した動作ではありません。
Sreekanth Karumanaghat 2017

42

originalArrayList。addAll(copyArrayList);

注意:addAll()メソッドを使用してコピーする場合、両方の配列リストのコンテンツ(originalArrayListとcopyArrayList)は同じオブジェクトまたはコンテンツを参照します。したがって、それらのいずれかを変更すると、もう一方も同じ変更を反映します。

これを望まない場合は、forループまたはwhileループを使用するように、originalArrayListからcopyArrayListに各要素をコピーする必要があります。


1
別のリストへの影響を止める方法は、これを処理できる他の方法があります
Mahesh

@Mahesh -この参照してくださいstackoverflow.com/questions/715650/...を
KrishPrabakar

17

代入演算子を介してJavaで作成された暗黙のコピーはありません。変数には参照値(ポインター)が含まれており、使用する=ときはその値のみを処理します。

内容を保存myTempObjectするには、そのコピーを作成する必要があります。

これはArrayList、別のコンストラクターを使用して新しいコンストラクターを作成することで実行できますArrayList

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

編集:ボヘミアンが以下のコメントで指摘しているように、これはあなたが求めていることですか?上記を実行すると、ArrayLists(myTempObjectmyObject)の両方に同じオブジェクトへの参照が含まれます。に含まれるオブジェクトの新しいコピーを含む新しいリストが実際にmyTempObject必要な場合は、元のオブジェクトの個々のオブジェクトのコピーを作成する必要があります。ArrayList


1
この場合、呼び出しclear()ArrayList myTempObjecttherinに含まれるオブジェクトに影響を与えないため、正常に機能します。彼がリストに含まれているオブジェクトの新しいコピーが必要な場合、それは別の話ですが、それは私がこの質問を尋ねていると解釈したものではありません。
ブライアンローチ2011

あなたは私があなたが正しいと思うことを知っています。はその質問誤解した。彼は、一方をクリアするともう一方がクリアされるのではないかと心配していました。コメントを削除しました。
ボヘミアン

@ Bohemian-それは公正なコメントだったと思うので、それを反映するように投稿を編集しました。彼の質問を読んだとき、それがOPの意図かもしれないとは思いませんでした。
ブライアンローチ2011

@BrianRoachArrayList内のArrayListのコピーを取得する方法。
アルン2015

8

私自身も同じ問題に直面しながら、これに出くわしました。

arraylist1 = arraylist2と言うと、両方が同じ場所を指すように設定されるため、どちらかを変更するとデータが変更され、両方のリストは常に同じままになります。

値を独立したリストにコピーするには、foreachを使用してコンテンツをコピーしました。

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

現在の方法でlist1に入力します。

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

4

oldListをnewListという新しいArrayListオブジェクトにコピーしたいとします。

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

これらの2つのリストは独立しており、一方への変更はもう一方には反映されません。


4

例を試してみましょう

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

以下のような印刷出力

1
2
3
4
5
6

正確なコピーを作成するために使用されるclone()メソッドを使用して行うこともできます

そのためにあなたは次のように試すことができます

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**

3

あなたclone()は個々のオブジェクトに必要です。Constructorおよび他の方法は浅いコピーを実行します。Collections.copyメソッドを試すことができ ます。


Collections.copy は壊れてます。まず、要素をコピーすると言うのは誤解を招きますが、新しいリストでそれらを参照するだけです。第二に、あなたは...すでにサイズがソースリストより低い持たない宛先リストを持っている必要があります
ACV

1

元のリストのディープコピーを作成する簡単な方法は、あるリストから別のリストにすべての要素を追加することです。

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

これで、originalListに変更を加えても、duplicateListには影響しません。


0

一方のリストをもう一方のリストにコピーするには、Collection.copy(myObject myTempObject)というメソッドを使用できます。これらのコード行を実行すると、myObject内のすべてのリスト値を確認できます。


0

1つのリストを2番目にコピーするのは非常に簡単です。次のように行うことができます:-

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

0

あるarrayListから別のarrayListにすべてのオブジェクトをコピーするための回避策は次のとおりです。

 ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subListは、データの範囲を含むリストを返すことを目的としています。したがって、arrayList全体またはその一部をコピーできます。


0

文字列型の2つの配列リストがあるとします。お気に入り

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

次に、2番目の配列のデータを次のように最初のarraylistにコピーする必要があります。

firstArrayList = new ArrayList<>(secondArrayList );

完了!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.