JavaでListを複製する場合は、
List<T> list = new ArrayList<>(List<T>);
で可能。
その際、複製されたListは別のメモリ領域が割り当てられ、別オブジェクトとなる。
Listの複製検証
List list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// List複製
List list2 = new ArrayList<>(list);
list2.add("ZZ");
// List複製
List list2 = new ArrayList<>(list);
list2.add("ZZ");
System.out.println(list);
// →[A, B, C]
System.out.println(list2);
// →[A, B, C, ZZ]
// 別インスタンスであることを確認
System.out.println(list==list2);
// →false
オブジェクトの配列を使用した時の挙動は以下。
Listの複製検証(オブジェクト型)
import java.util.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
List<customObj> objList = new ArrayList<>();
objList.add(new customObj(1, "1"));
objList.add(new customObj(2, "2"));
objList.add(new customObj(3, "3"));
List<customObj> objList2 = new ArrayList<>(objList);
objList2.add(new customObj(4, "4"));
System.out.println(objList);
// → [Main$customObj@36baf30c, Main$customObj@7a81197d, Main$customObj@5ca881b5]
System.out.println(objList2);
// → [Main$customObj@36baf30c, Main$customObj@7a81197d, Main$customObj@5ca881b5, Main$customObj@24d46ca6]
// 別インスタンスであることを確認
System.out.println(objList == objList2);
// → false
// Listは別インスタンスだが、個々の要素は同じオブジェクトを参照している。
System.out.println(objList.get(0) == objList2.get(0)); // →true
System.out.println(objList.get(1) == objList2.get(1)); // →true
System.out.println(objList.get(2) == objList2.get(2)); // →true
}
private static class customObj {
int valInt;
String valStr;
// Getter,Setter,コンストラクタは省略
}
}
複製したListは新しい領域が割り当てられているが、参照しているオブジェクトは使い回し。
図にすると以下のような感じ。

配列の要素の増減や並べ替えをする場合は、相互に影響はないが、個々の要素の中身を変更する場合は影響が出るので注意が必要。