为什么ArrayList没有varargs构造函数?

Nik*_*las 4 java arrays collections constructor arraylist

我的问题可能听起来很愚蠢,但请先阅读整个问题.

我想知道很长一段时间,为什么ArrayList和其他类实现List,Set等,没有提供一个简单的构造函数来接受参数的变量计数?

List<Integer> list = new ArrayList<>(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

这看起来简单明了.Java 9提供了新的List.of()静态工厂方法,它只复制Apache Utils和Guava引入的相同内容.我们被迫使用冗长的解决方法.

List<Integer> list = Arrays.asList(1, 2, 3);
List<Integer> list = Stream.of(1, 2, 3).collect(Collectors.toList());
List<Integer> list = new ArrayList<Integer>() {{ add(1); add(2); add(3); }};
Run Code Online (Sandbox Code Playgroud)

...除非我们乐意升级到Java 9或向上面的一个util库添加依赖项,或者创建一个扩展ArrayList和编写我们自己的构造函数的类.


最后,我问的问题:是什么原因使设计师省略了这个构造函数?

你可以说我已经存在一个构造函数ArrayList(int initialCapacity),它"构造一个具有指定初始容量的空列表"(同一页面的源代码) - 我知道这与我的想法相冲突,但说实话:我们多少次不得不提前声明ArrayList的大小?我们不需要具有用于ex的预定义值的ArrayList.单元测试数据?仅99.9%的情况下,默认情况下初始化new ArrayList<>()哪些调用是不够的this(10)

每个List::add(..)调用一个方法来确保存储大量数据的数组的数组的大小,并且具有预定义大小的ArrayList的构造函数是受欢迎的 - 所以,为什么我们不使用数组?之后我们需要编辑大型数组吗?-将其添加到使用Arrays.asList(阵列)ArrayList中它要求System.arraycopy只是一次,或者我们可以的ensureCapacity.

这是我在浏览java.util中的一些类之后理解ArrayList的当前设计的方式.请纠正我的理解错误或知识不足的地方.

是否有任何技术问题解释为什么构造函数 new ArrayList<>(1, 2, 3) 没有实现?

Mak*_*oto 7

ArrayList存在于Java 1.2中. Varargs是Java 1.5中引入的一项功能(以及一大堆其他功能).

您可以实现列表的vararg初始化所需的所有功能Arrays.asList,由于使用了varargs,因此必须在Java 1.5之前或之后存在.