詳解Java中ArrayList、Vector、LinkedList三者的異同點

1、ArrayList

ArrayList是一個能夠處理變長數組的類型,這裏不侷限於「數」組,ArrayList是一個泛型類,能夠存聽任意類型的對象。顧名思義,ArrayList是一個數組列表,所以其內部是使用一個數組來存放對象的,由於Object是一切類型的父類,於是ArrayList內部是有一個Object類型的數組類存放對象。ArrayList類經常使用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同時ArrayList內部有一個私有類實現Iterator接口,所以可使用iterator()方法獲得ArrayList的迭代器,同時,還有一個私有類實現了ListIterator接口,所以ArrayList也能夠調用listIterator()方法獲得ListIterator迭代器。 數組

因爲ArrayList是依靠數組來存放對象的,只不過封裝起來了而已,所以其一些查找方法的效率都是O(n),跟普通的數組效率差很少,只不過這個ArrayList是一個可變」數組「,而且能夠存放一切指定的對象。 安全

另外,因爲ArrayList的全部方法都是默認在單一線程下進行的,所以ArrayList不具備線程安全性。若想在多線程下使用,應該使用Colletions類中的靜態方法synchronizedList()對ArrayList進行調用便可。 多線程

2、LinkedList

LinkedList能夠看作爲一個雙向鏈表,全部的操做均可以認爲是一個雙向鏈表的操做,由於它實現了Deque接口和List接口。一樣,LinkedList也是線程不安全的,若是在併發環境下使用它,一樣用Colletions類中的靜態方法synchronizedList()對LinkedList進行調用便可。 併發

在LinkedList的內部實現中,並非用普通的數組來存放數據的,而是使用結點<Node>來存放數據的,有一個指向鏈表頭的結點first和一個指向鏈表尾的結點last。不一樣於ArrayList只能在數組末尾添加數據,LinkList能夠很方便在鏈表頭或者鏈表尾插入數據,或者在指定結點先後插入數據,還提供了取走鏈表頭或鏈表尾的結點,或取走中間某個結點,還能夠查詢某個結點是否存在。add()方法默認在鏈表尾部插入數據。總之,LinkedList提供了大量方便的操做方法,而且它的插入或增長等方法的效率明顯高於ArrayList類型,可是查詢的效率要低一點,由於它是一個雙向鏈表。 ui

所以,LinkedList與ArrayList最大的區別是LinkedList更加靈活,而且部分方法的效率比ArrayList對應方法的效率要高不少,對於數據頻繁出入的狀況下,而且要求操做要足夠靈活,建議使用LinkedList;對於數組變更不大,主要是用來查詢的狀況下,可使用ArrayList。 spa

3、Vector

Vector也是一個相似於ArrayList的可變長度的數組類型,它的內部也是使用數組來存放數據對象的。值得注意的是Vector與ArrayList惟一的區別是,Vector是線程安全的,即它的大部分方法都包含有關鍵字synchronized,所以,若對於單一線程的應用來講,最好使用ArrayList代替Vector,由於這樣效率會快不少(相似的狀況有StringBuffer與StringBuilder);而在多線程程序中,爲了保證數據的同步和一致性,可使用Vector代替ArrayList實現一樣的功能。 線程

相關文章
相關標籤/搜索