いくつかのデータ構造があり、一方を一時的なものとして使用し、もう一方を一時的でないものとして使用したいと思います。
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
もクリアされるということです。
Javaを使用してmyTempObject
のmyObject
の値を保持するにはどうすればよいですか?
このようなトリックを使用できます:
myObject = new ArrayList<Object>(myTempObject);
または使用する
myObject = (ArrayList<Object>)myTempObject.clone();
Clone()メソッドに関する情報を取得できます here
ただし、これらすべての方法で、すべての要素ではなく、Listのコピーが得られることに注意してください。したがって、コピーしたリストの要素の1つを変更すると、元のリストの要素も変更されます。
originalArrayList .addAll(copyArrayList);
注意してください:addAll()メソッドを使用してコピーする場合、両方の配列リスト(originalArrayListおよびcopyArrayList)のコンテンツは、同じオブジェクトまたはコンテンツを参照します。そのため、いずれかを変更すると、もう一方にも同じ変更が反映されます。
これを望まない場合は、forまたはwhileループを使用するなど、originalArrayListからcopyArrayListに各要素をコピーする必要があります。
割り当て演算子を介してJavaに暗黙のコピーが作成されることはありません。変数には参照値(ポインター)が含まれており、=
を使用するときは、その値のみをコピーしています。
myTempObject
の内容を保持するには、そのコピーを作成する必要があります。
これは、別のArrayList
をとるコンストラクターを使用して、新しいArrayList
を作成することで実行できます。
ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
編集:ボヘミアンは以下のコメントで指摘しているように、これはあなたが求めていることですか?上記を実行すると、ArrayList
s(myTempObject
およびmyObject
)の両方にsameオブジェクトへの参照が含まれます。 myTempObject
に含まれるオブジェクトの新しいコピーを含む新しいリストが実際に必要な場合は、元のArrayList
にある個々のオブジェクトのコピーを作成する必要があります。
同じ問題に自分自身で直面しながら、これに出くわしました。
Arraylist1 = arraylist2と指定すると、両方が同じ場所を指すように設定されるため、データを変更すると、両方のリストが常に同じままになります。
値を独立したリストにコピーするには、foreachを使用して内容をコピーしました。
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
list1を現在の方法で埋めます。
foreach(<type> obj in list1)
{
list2.Add(obj);
}
OldListをnewListと呼ばれる新しいArrayListオブジェクトにコピーしたい場合
ArrayList<Object> newList = new ArrayList<>() ;
for (int i = 0 ; i<oldList.size();i++){
newList.add(oldList.get(i)) ;
}
これら2つのリストは独立しており、一方への変更はもう一方には反映されません。
例を試してみましょう
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
二
三
四
五
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());
}**
個々のオブジェクトをclone()
する必要があります。 Constructor
およびその他のメソッドはシャローコピーを実行します。 Collections.copy メソッドを試すことができます。
元のリストのディープコピーを作成する簡単な方法は、あるリストから別のリストにすべての要素を追加することです。
ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();
for(Object o : originalList) {
duplicateList.add(o);
}
これで、originalListに変更を加えても、duplicateListには影響しません。
1つのarrayListから別のarrayListにすべてのオブジェクトをコピーする回避策は次のとおりです。
ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();
myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subListは、データの範囲を含むリストを返すことを目的としています。そのため、arrayList全体またはその一部をコピーできます。
1つのリストを他のリストにコピーするには、Collection.copy(myObject myTempObject)というメソッドを使用します。これらのコード行を実行すると、uはmyObject内のすべてのリスト値を確認できます。
1つのリストを2番目にコピーするのは非常に簡単です。以下のようにできます。
ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);