List接口一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,可以維護元素的次序,而且容許元素的重複。數組
ArrayList是最經常使用的List實現類,內部是經過數組實現的,它容許對元素進行快速隨機訪問。數組的缺點是每一個元素之間不能有間隔,當數組大小不知足時須要增長存儲能力,就要講已經有數組的數據複製到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,須要對數組進行復制、移動、代價比較高。所以,它適合隨機查找和遍歷,不適合插入和刪除。
Vector與ArrayList同樣,也是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問ArrayList慢。
LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。
查看Java源代碼,發現當數組的大小不夠的時候,須要從新創建數組,而後將元素拷貝到新的數組內,ArrayList和Vector的擴展數組的大小不一樣。多線程
1.對ArrayList和LinkedList而言,在列表末尾增長一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部數組中增長一項,指向所添加的元素,偶爾可能會致使對數組從新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry對象。
2.在ArrayList的 中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不支持高效的隨機元素訪問。
4.ArrayList的空 間浪費主要體如今在list列表的結尾預留必定的容量空間,而LinkedList的空間花費則體如今每個元素都須要消耗至關的空間 性能
能夠這樣說:當操做是在一列 數據的後面添加數據而不是在前面或中間,而且須要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操做是在一列數據的前面或中 間添加或刪除數據,而且按照順序訪問其中的元素時,就應該使用LinkedList了。 線程
因此,若是隻是查找特定位置的元素或只在集合的末端增長、移除元素,那麼使用Vector或ArrayList均可以。若是是對其它指定位置的插入、刪除操做,最好選擇LinkedList。
對象