30

我有下面的java代码。

List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.

现在列表有 100 个对象。

如果我再创建一个实例,如下所示:

List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
4

5 回答 5

39

一个对象在内存中只存在一次。您的第一个添加list只是添加对象引用。

anotherList.addAll也只会添加参考。所以内存中仍然只有 100 个对象。

如果您list通过添加/删除元素进行更改,anotherList则不会更改。但是,如果您更改 中的任何对象list,则在从 访问它时,它的内容也会更改,anotherList因为从两个列表中都指向相同的引用。

于 2012-06-30T10:51:35.590 回答
9

100,它将持有相同的引用。因此,如果您对 中的特定对象进行更改list,它将影响 中的相同对象anotherList

在任何列表中添加或删除对象都不会影响另一个。

list并且anotherList是两个不同的实例,它们仅包含它们“内部”对象的相同引用。

于 2012-06-30T10:48:16.820 回答
6

引用官方javadoc List.addAll

Appends all of the elements in the specified collection to the end of
this list, in the order that they are returned by the specified
collection's iterator (optional operation).  The behavior of this
operation is undefined if the specified collection is modified while
the operation is in progress.  (Note that this will occur if the
specified collection is this list, and it's nonempty.)

因此,您会将对象的引用复制listanotherList. 任何不对 的引用对象进行操作的方法anotherList(如移除、添加、排序)都是它的本地方法,因此不会影响list.

于 2012-06-30T10:52:21.103 回答
2

接口列表addAll(collection c)的Java API节选参见此处

“将指定集合中的所有元素附加到此列表的末尾,按照指定集合的​​迭代器返回的顺序(可选操作)。”

您将拥有与两个列表中一样多的对象-第一个列表中的对象数量加上第二个列表中的对象数量-在您的情况下为 100。

于 2012-06-30T10:54:14.290 回答
0

不...一旦您执行了语句 anotherList.addAll(list) 之后,如果您更改某些列表数据,它就不会携带到另一个列表

于 2012-06-30T10:46:55.730 回答