java - 为什么 ArrayList 没有可变参数构造函数?

标签 java arrays arraylist collections constructor

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




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

想了很久,为什么ArrayList和其他实现 List、Set 等的类,不提供接受参数变量计数的简单构造函数?

List<Integer> list = new ArrayList<>(1, 2, 3);

这看起来简单而明显。 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); }};

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

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

你可以争辩说已经存在一个构造函数 ArrayList(int initialCapacity)它“构造一个具有指定初始容量的空列表”(同一页面的来源)-我知道这与我的想法相冲突,但老实说:我们必须提前多少次声明 ArrayList 的大小?我们不需要一个带有用于 ex 的预定义值的 ArrayList。单元测试数据?不足以初始化 new ArrayList<>()其中调用 this(10)默认情况下 99,9% 的情况?

每个List::add(..)调用一个方法来确保数组的大小存储对于大量数据来说是昂贵的值,并且欢迎使用具有预定义大小的 ArrayList 构造函数 - 那么,为什么我们不使用数组呢?之后我们需要编辑大数组吗? - 使用调用 System.arraycopy 的 Arrays.asList(array) 将其添加到 ArrayList只是 once ,或者我们可以 ensureCapacity .

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

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

最佳答案

ArrayList existed in Java 1.2.可变参数是引入的功能 in Java 1.5 (以及一大堆其他功能)。

从列表的可变参数初始化中真正需要的所有功能都可以在 Arrays.asList 中实现。 ,由于使用可变参数,它必须在 Java 1.5 前后或之后存在。

关于java - 为什么 ArrayList 没有可变参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330475/

相关文章:

java - 对包含带数字的字符串的文件名数组进行排序

javascript - 在 JavaScript 中使用数组

java - 有效的方法反转来反转 HashMap ,其中少量的键映射到相同的值

java - ArrayList OutOfBounds - Java (Android) 编程

javascript - 如何在没有递归函数的情况下在javascript中获取数组项的可能序列?

arrays - 何时在数组/数组列表上使用链表?

java - 在不使用标记器状态的情况下消除标记歧义

java - 正则表达式检查是否有句子

java - 字符串数组数据未显示在 TextView 中

java - 使用 switch 语句比使用 if 语句更快,还是将 case 放在 hashMap 中并只使用 contains 方法?