为什么没有ArrayList(T t)构造函数?
以这种方式通过对象数组初始化列表是很常见的:
Foo[] objs = ...; ArrayList list = new ArrayList(Arrays.asList(objs));
我想知道,有没有理由为什么ArrayList的desiner没有包含带数组作为参数的构造函数,所以它可以像这样初始化:
ArrayList list = new ArrayList(objs);
可能违反了一些原则,线程安全或其他什么?
我不知道为什么它不在标准库中,但是Guava的Lists
类有newArrayList
,它甚至可以帮助进行类型推断:
ArrayList list = Lists.newArrayList(objs);
(如果你Lists.newArrayList
使用它,你可能想静态导入Lists.newArrayList
。)
您可以使用Google Guava Library(AKA Google Collections):
String[] ary = {"a", "b"}; List l = Lists.newArrayList(ary);
似乎ArrayList没有实现任何构造函数本身但只是委托调用超类构造函数(即AbstractList的构造函数)的原因。 有很多列表实现,包括LinkedList,不应该有接受数组的构造函数。
我认为在类Arrays中缺少接受数组和静态实用程序方法的构造函数是良好设计和更好的代码重用的一个例子。 这是正确的,它导致我们写一些更详细的代码,但这是价格。
顺便说一句,如果您使用的是静态import java.util.Arrays
,则可以在不提及数组的情况下调用asList()
,因此代码不会冗长。
java.util.Arrays
内部使用自己的ArrayList
类版本…
private static class ArrayList extends AbstractList implements RandomAccess, java.io.Serializable { ... }
不知道为什么它不作为标准构造函数调用包含…但你可以跟随java.util.Arrays
的引导并拥有自己的Arraylist版本。