java-Java 集合 List總結(jié)(LinkedList, ArrayList等使用場(chǎng)景和性能分析)

List概括

先回顧一下List的框架圖

Paste_Image.png
  • List 是一個(gè)接口给赞,它繼承于Collection的接口逃呼。它代表著有序的隊(duì)列夏醉。
  • AbstractList 是一個(gè)抽象類鞍泉,它繼承于AbstractCollection。AbstractList實(shí)現(xiàn)List接口中除size()阁簸、get(int location)之外的函數(shù)爬早。
  • AbstractSequentialList 是一個(gè)抽象類,它繼承于AbstractList启妹。AbstractSequentialList 實(shí)現(xiàn)了“鏈表中筛严,根據(jù)index索引值操作鏈表的全部函數(shù)”。
  • 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ī)訪問(wèn)效率高照瘾,隨機(jī)插入、隨機(jī)刪除效率低丧慈。
  • LinkedList 是一個(gè)雙向鏈表网杆。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作伊滋。LinkedList隨機(jī)訪問(wèn)效率低,但隨機(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)藤韵。

第2部分 List使用場(chǎng)景

學(xué)東西的最終目的是為了能夠理解虐沥、使用它。下面先概括的說(shuō)明一下各個(gè)List的使用場(chǎng)景泽艘,后面再分析原因欲险。

如果涉及到“棧”匹涮、“隊(duì)列”天试、“鏈表”等操作,應(yīng)該考慮用List然低,具體的選擇哪個(gè)List喜每,根據(jù)下面的標(biāo)準(zhǔn)來(lái)取舍。

  • 對(duì)于需要快速插入雳攘,刪除元素带兜,應(yīng)該使用LinkedList。
  • 對(duì)于需要快速隨機(jī)訪問(wèn)元素来农,應(yīng)該使用ArrayList鞋真。
  • 對(duì)于“單線程環(huán)境” 或者 “多線程環(huán)境,但List僅僅只會(huì)被單個(gè)線程操作”沃于,此時(shí)應(yīng)該使用非同步的類(如ArrayList)涩咖。
  • 對(duì)于“多線程環(huán)境,且List可能同時(shí)被多個(gè)線程操作”繁莹,此時(shí)檩互,應(yīng)該使用同步的類(如Vector)。

通過(guò)下面的測(cè)試程序咨演,我們來(lái)驗(yàn)證上面的(01)和(02)結(jié)論闸昨。參考代碼如下:

import java.util.*;
import java.lang.Class;

/*
 * @desc 對(duì)比ArrayList和LinkedList的插入、隨機(jī)讀取效率薄风、刪除的效率
 *
 * @author skywang
 */
public class ListCompareTest {

    private static final int COUNT = 100000;

    private static LinkedList linkedList = new LinkedList();
    private static ArrayList arrayList = new ArrayList();
    private static Vector vector = new Vector();
    private static Stack stack = new Stack();

    public static void main(String[] args) {
        // 換行符
        System.out.println();
        // 插入
        insertByPosition(stack) ;
        insertByPosition(vector) ;
        insertByPosition(linkedList) ;
        insertByPosition(arrayList) ;

        // 換行符
        System.out.println();
        // 隨機(jī)讀取
        readByPosition(stack);
        readByPosition(vector);
        readByPosition(linkedList);
        readByPosition(arrayList);

        // 換行符
        System.out.println();
        // 刪除 
        deleteByPosition(stack);
        deleteByPosition(vector);
        deleteByPosition(linkedList);
        deleteByPosition(arrayList);
    }

    // 獲取list的名稱
    private static String getListName(List list) {
        if (list instanceof LinkedList) {
            return "LinkedList";
        } else if (list instanceof ArrayList) {
            return "ArrayList";
        } else if (list instanceof Stack) {
            return "Stack";
        } else if (list instanceof Vector) {
            return "Vector";
        } else {
            return "List";
        }
    }

    // 向list的指定位置插入COUNT個(gè)元素饵较,并統(tǒng)計(jì)時(shí)間
    private static void insertByPosition(List list) {
        long startTime = System.currentTimeMillis();

        // 向list的位置0插入COUNT個(gè)數(shù)
        for (int i=0; i<COUNT; i++)
            list.add(0, i);

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(getListName(list) + " : insert "+COUNT+" elements into the 1st position use time:" + interval+" ms");
    }

    // 從list的指定位置刪除COUNT個(gè)元素,并統(tǒng)計(jì)時(shí)間
    private static void deleteByPosition(List list) {
        long startTime = System.currentTimeMillis();

        // 刪除list第一個(gè)位置元素
        for (int i=0; i<COUNT; i++)
            list.remove(0);

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(getListName(list) + " : delete "+COUNT+" elements from the 1st position use time:" + interval+" ms");
    }

    // 根據(jù)position遭赂,不斷從list中讀取元素循诉,并統(tǒng)計(jì)時(shí)間
    private static void readByPosition(List list) {
        long startTime = System.currentTimeMillis();

        // 讀取list元素
        for (int i=0; i<COUNT; i++)
            list.get(i);

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(getListName(list) + " : read "+COUNT+" elements by position use time:" + interval+" ms");
    }
}

從中,我們可以發(fā)現(xiàn):

  • 插入10萬(wàn)個(gè)元素撇他,LinkedList所花時(shí)間最短:29ms茄猫。
  • 刪除10萬(wàn)個(gè)元素狈蚤,LinkedList所花時(shí)間最短:15ms。
  • 遍歷10萬(wàn)個(gè)元素划纽,LinkedList所花時(shí)間最長(zhǎng):10809 ms脆侮;而ArrayList、Stack和Vector則相差不多勇劣,都只用了幾秒靖避。

考慮到Vector是支持同步的,而Stack又是繼承于Vector的芭毙;因此筋蓖,得出結(jié)論:

  • 對(duì)于需要快速插入,刪除元素退敦,應(yīng)該使用LinkedList粘咖。
  • 對(duì)于需要快速隨機(jī)訪問(wèn)元素,應(yīng)該使用ArrayList侈百。
  • 對(duì)于“單線程環(huán)境” 或者 “多線程環(huán)境瓮下,但List僅僅只會(huì)被單個(gè)線程操作”,此時(shí)應(yīng)該使用非同步的類钝域。Vector
  • ArrayList支持序列化讽坏,而Vector不支持;即ArrayList有實(shí)現(xiàn)java.io.Serializable接口例证,而Vector沒(méi)有實(shí)現(xiàn)該接口路呜。
  • Vector支持通過(guò)Enumeration去遍歷,而對(duì)于需要快速插入织咧,刪除元素胀葱,應(yīng)該使用LinkedList,ArrayList不支持

本文來(lái)自: http://www.cnblogs.com/skywang12345/p/3308900.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笙蒙,一起剝皮案震驚了整個(gè)濱河市抵屿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捅位,老刑警劉巖轧葛,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艇搀,居然都是意外死亡尿扯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門焰雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姜胖,“玉大人,你說(shuō)我怎么就攤上這事淀散∮依常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵档插,是天一觀的道長(zhǎng)慢蜓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)郭膛,這世上最難降的妖魔是什么晨抡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮则剃,結(jié)果婚禮上耘柱,老公的妹妹穿的比我還像新娘。我一直安慰自己棍现,他們只是感情好调煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著己肮,像睡著了一般士袄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谎僻,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天娄柳,我揣著相機(jī)與錄音,去河邊找鬼艘绍。 笑死赤拒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱鞠。 我是一名探鬼主播挎挖,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼般甲!你這毒婦竟也來(lái)了肋乍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敷存,失蹤者是張志新(化名)和其女友劉穎墓造,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锚烦,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅闽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涮俄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉拙。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彻亲,靈堂內(nèi)的尸體忽然破棺而出孕锄,到底是詐尸還是另有隱情吮廉,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布畸肆,位于F島的核電站宦芦,受9級(jí)特大地震影響咏连,放射性物質(zhì)發(fā)生泄漏情竹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一幼苛、第九天 我趴在偏房一處隱蔽的房頂上張望大咱。 院中可真熱鬧恬涧,春花似錦、人聲如沸碴巾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)餐抢。三九已至现使,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旷痕,已是汗流浹背碳锈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欺抗,地道東北人售碳。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绞呈,于是被迫代替她去往敵國(guó)和親贸人。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容