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