用于内容复制的ArrayList.addAll(list)和新ArrayList <>(列表)之间的区别

use*_*r25 1 java

我知道,list2.addAll(list1)让我们可以附加对象追加到list2list1是否list2已经有一些对象调用此方法之前

但我不附加任何内容,我想知道下一个案例的区别

使用下一个方法制作列表副本时会有什么不同

例如,我有一些对象的列表(list1),我想制作它的副本,将其内容复制到另一个列表(到一个新的列表 - list2)

List<Foo> list1 = new ArrayList<>();
list1.add(new Foo());
...
Run Code Online (Sandbox Code Playgroud)

方法1

List<Foo> list2 = new ArrayList<>(list1);
Run Code Online (Sandbox Code Playgroud)

方法2

List<Foo> list2 = new ArrayList<>();
list2.addAll(list1);
Run Code Online (Sandbox Code Playgroud)

更新

实际上甚至IntelliJ IDEA建议我将方法2转换为方法1:

在此输入图像描述

Let*_*ate 5

是的,我认为方法2会有点无效,我的观点是:

当你这样做:

List<Object> list2 = new ArrayList<Object>(list1);
Run Code Online (Sandbox Code Playgroud)

ArrayList已经知道它需要分配给内存的大小,该内存是list1中Object的计数.

在方法2中,它创建一个具有默认大小list2对象.在执行添加操作时,它会自动更新.因为这将是一项额外的操作.