我的问题可能听起来很愚蠢,但请先阅读整个问题。
我想知道很长一段时间,为什么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),它构造了一个具有指定初始容量的空列表&#34; (来自同一页面) - 我知道这与我的想法相冲突,但老实说:我们必须提前多少次声明ArrayList的大小?我们不需要具有用于ex的预定义值的ArrayList。单元测试数据?是否足以初始化new ArrayList<>()
,默认情况下会调用this(10)
99.9%的案例?
每个List::add(..)
调用一个方法来确保存储值对于大量数据而言代价昂贵的数组的大小,并且具有预定义大小的ArrayList的构造函数是受欢迎的 - 所以,为什么不这样做?我们用数组吗?之后我们需要编辑大型数组吗? - 使用Arrays.asList(array)将它添加到ArrayList,只调用System.arraycopy
once,或者ensureCapacity。
这是我在浏览java.util中的一些类之后理解ArrayList的当前设计的方式。请纠正我的理解错误或知识不足的地方。
是否有任何技术问题解释为什么构造函数 new ArrayList<>(1, 2, 3)
未实现?
答案 0 :(得分:7)
ArrayList
existed in Java 1.2. Varargs是一个介绍in Java 1.5的功能(以及一大堆其他功能)。
您在列表的vararg初始化中真正需要的所有功能都可以在Arrays.asList
中实现,由于使用了varargs,因此必须在Java 1.5之前或之后存在。