0

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

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

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

4

3 回答 3

2

该副本将包含对源列表对象的相同引用,因为您只复制引用,即浅拷贝。

因此,您可以更改列表,例如在不更改源列表的情况下删除或添加元素。

但是,如果您更改列表的元素,则更改将显示在两个列表中,即源和副本中。

于 2013-10-16T23:04:21.640 回答
1

不,这两个列表并不完全相互独立。创建另一个ArrayList将起作用,但它将引用与原始列表相同的项目。您已经创建了一个浅拷贝。

新列表是一个单独的列表,但修改一个列表中的对象将在另一个列表中可见。

要创建完全独立的列表,您需要创建列表的深层副本,这也涉及复制列表中的每个对象。

于 2013-10-16T22:57:50.183 回答
1
List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>(list1);

既然你用了关键字newlist1就绝对不等于list2。换句话说,它们是两个不同的列表。但是,它们共享相同的元素列表(即,这些元素具有相同的引用)。有关详细信息,请参阅 ArrayList 的复制构造函数

如果您想从原始列表中创建一个完全独立的列表,您可能需要进行深层复制。例如,

List<Obj> list1 = getList();
List<Obj> list2 = new ArrayList<Obj>();
for (Obj obj: list1) {
  list2.add(obj.clone());
}

注意:clone只制作对象的浅拷贝。

于 2013-10-16T23:23:12.603 回答