Java中的addAll函数会复制吗?

25
当调用 list.addAll(list2) 时,列表中的对象会被复制到列表内还是只会复制它们的引用?我在javadoc上找不到任何解释...
3个回答

41

不复制对象或其数据;它们的引用仅被添加到列表对象中。


如果我们稍后向list2添加一个元素,会发生什么?它会自动添加到list中吗? - iamprem
如果我修改了list2中的元素,那么从输出的list中我会看到这个修改吗? - Saorikido
你会如何复制并添加所有元素? - Jacolack
@Jacolack 只需使用 'List<YourObject> secondList = new ArrayList<>(firstList);' 这将在新列表中创建新对象,但具有旧值的值。 - Snickbrack
@Snickbrack 不是的。正如所有现有答案非常清楚地表明的那样,新列表将包含对原始对象的引用,而不是新对象。 - Ernest Friedman-Hill

5
不会复制对象,只会将指向相同对象的引用添加到列表中。

2
@ZiyaoWei这里说“附加所有元素”,因此它会执行该操作——附加所有元素。元素的副本并不是该元素本身,而只是其复制品。 - Dave Newton
如果我们稍后向list2添加一个元素,会发生什么?它会自动添加到list中吗? - iamprem
@DaveNewton 不是复制,而是对同一对象的引用。如果您更改列表中的对象,则它也会在列表之外发生变化。 - Snickbrack
@Snickbrack 是的,这就是评论的目的,澄清回答中原帖的问题。十年前。 - Dave Newton
@DaveNewton 是的 我知道我能够阅读。但你针对复制的回答很误导人,这就是为什么我澄清了 addAll 不创建任何副本而是使用引用。即使几十年过去了,如果它仍然是错的,我也不在乎。 - Snickbrack
显示剩余6条评论

3

一般情况下,Java 在“添加所有”时不会复制对象,即对于对象,将使用指向原始对象的指针。

* 但要小心!对于字符串,由于其不可变性,数组拷贝不会指向原始字符串值,您不能期望将指向添加到数组列表中的字符串的指针更改为数组列表内的新值。


你怎样复制并添加全部(addAll)? - Jacolack
@Jacolack 只需使用 'List<YourObject> secondList = new ArrayList<>(firstList);' 这将在新列表中创建新对象,但具有旧值的值。 - Snickbrack
@Snickbrack 不对。正如所有现有答案非常清楚地表明的那样,新列表将包含对原始对象的引用,而不是新对象。 - Ernest Friedman-Hill

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