以下是否以Java中的两个独立列表结束?
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
此时list1和list2是否相互独立?
答案 0 :(得分:2)
副本将包含与源列表的对象相同的引用,因为您只复制引用,一个浅表副本。
因此您可以更改列表,如删除或添加元素而不更改源列表。
但是,如果您更改了列表中的元素,则更改将显示在列表,源和副本中。
答案 1 :(得分:1)
不,这两个列表并不完全相互独立。创建另一个ArrayList
将起作用,但它将引用与原始列表相同的项目。您已经创建了一个浅表副本。
新列表是一个单独的列表,但修改一个列表中的对象将在另一个列表中可见。
要创建完全独立的列表,您需要创建列表的深副本,其中还包括复制列表中的每个对象。
答案 2 :(得分:0)
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);
由于您使用了关键字new
,因此list1
绝对不等于list2
。换句话说,它们是两个不同的列表。但是,它们共享相同的元素列表(即,这些元素具有相同的引用)。有关详细信息,请参阅ArrayList的copy constructor。
如果要从原始列表中创建完全独立的列表,则可能需要执行深层复制。例如,
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>();
for (Obj obj: list1) {
list2.add(obj.clone());
}
注意:clone
仅制作对象的浅表副本。