綜述
(01) List 是一個(gè)接口渔嚷,它繼承于Collection的接口伯复。它代表著有序的隊(duì)列涮雷。
(02) AbstractList 是一個(gè)抽象類葬项,它繼承于AbstractCollection。AbstractList實(shí)現(xiàn)List接口中除size()梧却、get(int location)之外的函數(shù)奇颠。
(03) AbstractSequentialList 是一個(gè)抽象類,它繼承于AbstractList放航。AbstractSequentialList 實(shí)現(xiàn)了“鏈表中烈拒,根據(jù)index索引值操作鏈表的全部函數(shù)”。
(04) ArrayList, LinkedList, Vector, Stack是List的4個(gè)實(shí)現(xiàn)類广鳍。
ArrayList 是一個(gè)數(shù)組隊(duì)列荆几,相當(dāng)于動(dòng)態(tài)數(shù)組。它由數(shù)組實(shí)現(xiàn)赊时,隨機(jī)訪問效率高吨铸,隨機(jī)插入、隨機(jī)刪除效率低祖秒。
LinkedList 是一個(gè)雙向鏈表诞吱。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作狈涮。LinkedList隨機(jī)訪問效率低狐胎,但隨機(jī)插入、隨機(jī)刪除效率高歌馍。
Vector 是矢量隊(duì)列握巢,和ArrayList一樣,它也是一個(gè)動(dòng)態(tài)數(shù)組松却,由數(shù)組實(shí)現(xiàn)暴浦。但是ArrayList是非線程安全的,而Vector是線程安全的晓锻。
Stack 是棧歌焦,它繼承于Vector。它的特性是:先進(jìn)后出(FILO, First In Last Out)砚哆。
使用場景
如果涉及到“椂榔玻”、“隊(duì)列”、“鏈表”等操作纷铣,應(yīng)該考慮用List卵史,具體的選擇哪個(gè)List,根據(jù)下面的標(biāo)準(zhǔn)來取舍搜立。
(01) 對(duì)于需要快速插入以躯,刪除元素,應(yīng)該使用LinkedList啄踊。
(02) 對(duì)于需要快速隨機(jī)訪問元素忧设,應(yīng)該使用ArrayList。
(03) 對(duì)于“單線程環(huán)境” 或者 “多線程環(huán)境颠通,但List僅僅只會(huì)被單個(gè)線程操作”址晕,此時(shí)應(yīng)該使用非同步的類(如ArrayList);對(duì)于“多線程環(huán)境顿锰,且List可能同時(shí)被多個(gè)線程操作”斩箫,此時(shí),應(yīng)該使用同步的類(如Vector撵儿,Stack)。
Vector和ArrayList比較
相同:
1 它們都是List
2 它們繼承的類AbstractList狐血,實(shí)現(xiàn)的接口相同List淀歇,Cloneable,RandomAccess匈织,Serializable
3 它們都是通過數(shù)組實(shí)現(xiàn)的浪默,本質(zhì)上都是動(dòng)態(tài)數(shù)組
4 它們的默認(rèn)數(shù)組容量是10
5 它們都支持Iterator和listIterator遍歷
不同:
1 線程安全性不一樣
ArrayList是非線程安全;
而Vector是線程安全的缀匕,它的函數(shù)都是synchronized的纳决,即都是支持同步的。
ArrayList適用于單線程乡小,Vector適用于多線程阔加。
2 構(gòu)造函數(shù)個(gè)數(shù)不同
ArrayList有3個(gè)構(gòu)造函數(shù),而Vector有4個(gè)構(gòu)造函數(shù)满钟。Vector除了包括和ArrayList類似的3個(gè)構(gòu)造函數(shù)之外胜榔,另外的一個(gè)構(gòu)造函數(shù)可以指定容量增加系數(shù)。
3 容量增加方式不同
逐個(gè)添加元素時(shí)湃番,若ArrayList容量不足時(shí)夭织,“新的容量”=“(原始容量x3)/2 + 1”。即原容量的1.5倍吠撮。
int newCapacity = oldCapacity + (oldCapacity >> 1);
而Vector的容量增長與“增長系數(shù)有關(guān)”尊惰,若指定了“增長系數(shù)”,且“增長系數(shù)有效(即,大于0)”弄屡;那么题禀,每次容量不足時(shí),“新的容量”=“原始容量+增長系數(shù)”琢岩。若增長系數(shù)無效(即投剥,小于/等于0),則“新的容量”=“原始容量 x 2”担孔。
4 對(duì)Enumeration的支持不同江锨。Vector支持通過Enumeration去遍歷,而List不支持糕篇。