以下是否会以 Java 中的两个独立列表结束?
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
此时list1和list2是否相互独立?
该副本将包含对源列表对象的相同引用,因为您只复制引用,即浅拷贝。
因此,您可以更改列表,例如在不更改源列表的情况下删除或添加元素。
但是,如果您更改列表的元素,则更改将显示在两个列表中,即源和副本中。
不,这两个列表并不完全相互独立。创建另一个ArrayList
将起作用,但它将引用与原始列表相同的项目。您已经创建了一个浅拷贝。
新列表是一个单独的列表,但修改一个列表中的对象将在另一个列表中可见。
要创建完全独立的列表,您需要创建列表的深层副本,这也涉及复制列表中的每个对象。
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
既然你用了关键字new
,list1
就绝对不等于list2
。换句话说,它们是两个不同的列表。但是,它们共享相同的元素列表(即,这些元素具有相同的引用)。有关详细信息,请参阅 ArrayList 的复制构造函数。
如果您想从原始列表中创建一个完全独立的列表,您可能需要进行深层复制。例如,
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>();
for (Obj obj: list1) {
list2.add(obj.clone());
}
注意:clone
只制作对象的浅拷贝。