在Java中将一个列表插入另一个列表?

41

我有以下的Java代码:

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

现在列表有100个对象。

如果我按照以下方式创建一个新实例:

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

现在,内存中会有多少个对象:100个还是200个对象?

在下面的行中,是添加了对象还是只添加了引用?

anotherList.addAll(list);

如果我对 list 进行任何更改,这些更改会反映到 anotherList 上吗?反之亦然?


2
请注意,我回滚了原始问题,因为您的编辑忽略了问题本身的全部要点。 - Luca Geretti
5
问题在于这已经不是一个问题了,而且根本就没有任何意义 ;) - Thomas Clowes
请您编辑此问题,因为它并没有意义。 - oziomajnr
这个问题需要管理员的关注,看起来由于编辑的原因,这个问题已经不存在了。 - Yogesh D
5个回答

44

一个对象在内存中只有一个实例。将对象添加到list中的第一个操作只是添加了对象引用。

anotherList.addAll 也只是添加引用,因此内存中仍然只有100个对象。

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


1
如何清除或删除另一个列表的引用?例如, List<String> a = new ArrayList<>(); List<String> b = new ArrayList<>(); a.add("one"); a.add("two"); a.add("Three"); - Siva Sonai
不太清楚你的问题。也许你应该在SO上发布一个单独的问题。 - MicSim

14

当一个列表 (list) 被赋值给另一个变量 (anotherList) 时,它们将共享相同的引用。因此,如果您更改一个特定的对象在 list 中,将会影响到 anotherList 中相同的对象。

添加或移除其中任意一个列表中的对象都不会影响另一个列表。

listanotherList 是两个不同的实例,它们只保存了 "内部" 对象的相同引用。


谢谢您的回复。如果我在列表中添加/删除任何对象,是否会反映到另一个列表中? - user1016403
2
不会影响。list和anotherList是两个不同的实例,它们仅保存所包含对象的相同引用。 - setzamora

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.)

因此,您将把list中对象的引用复制到anotherList中。任何不操作anotherList的引用对象的方法(例如删除、添加、排序)都是局部的,因此不会影响list


2

以下是对Java API中List接口的addAll(collection c)方法的摘录,详情请见此处

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

在您的情况下,您将拥有两个列表中的对象总数 - 第一个列表中的对象数加上第二个列表中的对象数,即100个。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接