2010-11-29 86 views
15

这是很常见的通过这种方式对象数组初始化列表:为什么没有ArrayList(T [] t)构造函数?

Foo[] objs = ...; 
ArrayList<Foo> list = new ArrayList<Foo>(Arrays.asList(objs)); 

我不知道,是没有任何理由的ArrayList desiners不包括与数组作为参数的构造函数,因此,它可能是初始化如下:

ArrayList<Foo> list = new ArrayList<Foo>(objs); 

可能是违反了一些原则,线程安全或其他?

+0

我不能告诉你我有多少次与ArrayList一起工作过,并想知道为什么这个看似明显的*特性不是ArrayList的一部分 – mmcrae 2015-09-30 12:47:17

回答

11

我不知道为什么它不是在标准库,但GuavaLists类有newArrayList甚至与类型推断帮助:

ArrayList<Foo> list = Lists.newArrayList(objs); 

(您可能希望如果您使用导入Lists.newArrayList静态它很多)

2

看来,ArrayList没有实现任何构造函数本身,而是将调用委托给超类构造函数,即AbstractList的构造函数。有很多列表实现,包括不应该有接受数组的构造函数的LinkedList。

我认为在数组类中没有接受静态实用方法的数组和静态方法的构造函数是一个很好的设计和更好的代码重用的例子。这是正确的,它使我们写一些更详细的代码,但这是代价。

顺便说一句,如果你使用的是静态的import java.util.Arrays,那么你可以在不提及数组的情况下调用asList(),所以代码不要冗长。

0

java.util.Arrays内部使用它自己的版本ArrayList类的......

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable 
{ 
... 
} 

不知道为什么它没有作为一个标准的构造函数调用...但你可以按照java.util.Arrays铅和有自己的版本的Arraylist。

相关问题