2010-11-29 84 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。

相關問題