通过在java中使用list初始化list来创建独立的副本

时间:2013-10-16 22:56:00

标签: java list arraylist

以下是否以Java中的两个独立列表结束?

List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);

此时list1和list2是否相互独立?

3 个答案:

答案 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仅制作对象的浅表副本。