一言以蔽之,在大部分狀況下,使用ArrayList會好一些。java
List只是一個接口,而LinkedList、ArrayList是List的不一樣實現。LinkedList的模型是雙向鏈表,而ArrayList則是動態數組git
首先對比下經常使用操做的算法複雜度github
get(int index) : O(n)算法
add(E element) : O(1)數組
add(int index, E element) : O(n)spa
remove(int index) : O(n)指針
Iterator.remove() : O(1) <--- LinkedList的主要優勢orm
ListIterator.add(E element) is O(1) <--- LinkedList的主要優勢接口
get(int index) : O(1) <--- ArrayList的主要優勢element
add(E element) : 基本是O(1) , 由於動態擴容的關係,最差時是 O(n)
add(int index, E element) : 基本是O( n - index) , 由於動態擴容的關係,最差時是 O(n)
remove(int index) : O(n - index) (例如,移除最後一個元素,是 O(1))
Iterator.remove() : O(n - index)
ListIterator.add(E element) : O(n - index)
LinkedList,由於本質是個鏈表,因此經過Iterator來插入和移除操做的耗時,都是個恆量,但若是要獲取某個位置的元素,則要作指針遍歷。所以,get操做的耗時會跟List長度有關
對於ArrayList來講,得益於快速隨機訪問的特性,獲取任意位置元素的耗時,是常量的。可是,若是是add或者remove操做,要分兩種狀況,若是是在尾部作add,也就是執行add方法(沒有index參數),此時不須要移動其餘元素,耗時是O(1),但若是不是在尾部作add,也就是執行add(int index, E element),這時候在插入新元素的同時,也要移動該位置後面的全部元素,覺得新元素騰出位置,此時耗時是O(n-index)。另外,當List長度超過初始化容量時,會自動生成一個新的array(長度是以前的1.5倍),此時會將舊的array移動到新的array上,這種狀況下的耗時是O(n)。
總之,get操做,ArrayList快一些。而add操做,二者差很少。(除非是你但願在List中間插入節點,且維護了一個Iterator指向指定位置,這時候linkedList能快一些,可是,咱們更多時候是直接在尾部插入節點,這種特例的狀況並很少)