我有下面的java代码。
List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.
现在列表有 100 个对象。
如果我再创建一个实例,如下所示:
List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
我有下面的java代码。
List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.
现在列表有 100 个对象。
如果我再创建一个实例,如下所示:
List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
一个对象在内存中只存在一次。您的第一个添加list
只是添加对象引用。
anotherList.addAll
也只会添加参考。所以内存中仍然只有 100 个对象。
如果您list
通过添加/删除元素进行更改,anotherList
则不会更改。但是,如果您更改 中的任何对象list
,则在从 访问它时,它的内容也会更改,anotherList
因为从两个列表中都指向相同的引用。
100,它将持有相同的引用。因此,如果您对 中的特定对象进行更改list
,它将影响 中的相同对象anotherList
。
在任何列表中添加或删除对象都不会影响另一个。
list
并且anotherList
是两个不同的实例,它们仅包含它们“内部”对象的相同引用。
引用官方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
.
接口列表中addAll(collection c)的Java API节选参见此处
“将指定集合中的所有元素附加到此列表的末尾,按照指定集合的迭代器返回的顺序(可选操作)。”
您将拥有与两个列表中一样多的对象-第一个列表中的对象数量加上第二个列表中的对象数量-在您的情况下为 100。
不...一旦您执行了语句 anotherList.addAll(list) 之后,如果您更改某些列表数据,它就不会携带到另一个列表