以下は、Java の 2 つの独立したリストで終了しますか?
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
この時点で list1 と list2 は互いに独立していますか?
浅いコピーである参照のみをコピーするため、コピーにはソース リストのオブジェクトへの同じ参照が含まれます。
したがって、ソース リストを変更せずに要素を削除または追加する場合と同様に、リストを変更できます。
ただし、リストの要素を変更すると、ソースとコピーの両方のリストに変更が反映されます。
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
キーワードを使用したためnew
、list1
は絶対に と等しくありませんlist2
。つまり、これらは 2 つの異なるリストです。ただし、それらは同じ要素のリストを共有します (つまり、これらの要素は同じ参照を持ちます)。詳細については、ArrayListのコピー コンストラクターを参照してください。
元のリストから完全に独立したリストを作成する場合は、ディープ コピーが必要になる場合があります。例えば、
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>();
for (Obj obj: list1) {
list2.add(obj.clone());
}
注:clone
オブジェクトの浅いコピーのみを作成します。