List
實現分爲通用實現和專用實現。html
有兩種通用的List實現 — ArrayList和LinkedList,在大多數狀況下,你可能會使用ArrayList
,它提供了恆定時間的位置訪問,並且速度很快。它沒必要爲List
中的每一個元素分配節點對象,而且當必須同時移動多個元素時,能夠利用System.arraycopy
的優點,將ArrayList
視爲Vector
,而沒有同步開銷。java
若是你常常將元素添加到List
的開頭或遍歷List
以從其內部刪除元素,則應考慮使用LinkedList
,這些操做在LinkedList
中須要恆定時間和在ArrayList
中須要線性時間。可是在性能付出了巨大的代價,位置訪問在LinkedList
中須要線性時間和在ArrayList
中須要恆定時間。此外,LinkedList
的常數因子要差得多,若是你認爲要使用LinkedList
,請在選擇以前同時使用LinkedList
和ArrayList
評估應用程序的性能,ArrayList
一般更快。segmentfault
ArrayList
有一個調整參數 — 初始容量,它是ArrayList
增加以前能夠容納的元素數量,LinkedList
沒有調整參數和七個可選操做,其中之一是clone
,其餘六個是addFirst
、getFirst
、removeFirst
、addLast
、getLast
和removeLast
,LinkedList
還實現了Queue
接口。api
CopyOnWriteArrayList是一個由寫時複製數組備份的List
實現,此實現本質上相似於CopyOnWriteArraySet
。即便在迭代過程當中也不須要同步,而且保證迭代器永遠不會拋出ConcurrentModificationException
。此實現很是適合維護事件處理程序列表,在這些事件處理程序列表中更改不多,而且遍歷頻繁且可能很耗時。數組
若是須要同步,則Vector
會比用Collections.synchronizedList
同步的ArrayList
快一些。可是Vector有不少遺留操做,所以請務必始終使用List
接口操做Vector
,不然之後將沒法替換實現。oracle
若是你的List
大小固定 — 也就是說,你將永遠不會使用remove
、add
或除containsAll
之外的任何批量操做 — 你確定有第三種選擇值得考慮,有關更多信息,請參見便利實現部分中的Arrays.asList
。性能