Java集合復習之List

1.ArrayList

1.1.ArrayList集合特點
  • [可容納類型] :只能容納引用對象(基本類型需要轉換為封裝類)
  • [線程安全] :線程不安全
  • [底層實現(xiàn)] :底層使用數(shù)組實現(xiàn)顶籽,基于其實現(xiàn)方式低缩,有以下特點:初始化時需要聲明長度吧雹,超出長度需要擴容闲坎,不適合頻繁的移動魏身、刪除元素,搜索元素快
  • [元素可重復] :可重復
1.2 ArrayList排序
  • 自定義排序:list.sort(new Comparator(){自定義排序規(guī)則})
  • 快速排序 韩脑,使用Collections.sort(list)
1.3 ArrayList擴容
  • ArrayList內(nèi)部使用Arrays.copyOf(elementData, newCapacity)進行擴容谆奥,此方法每次都會創(chuàng)建一個新的newCapacity長度的數(shù)組,因此擴容的空間復雜度為O(n),時間復雜度為O(n)
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private void grow(int minCapacity) {
        // oldCapacity 是舊容量菇肃,newCapacity 是新容量
        int oldCapacity = elementData.length;
        //這里進行了擴容地粪,通過位運算,將舊容量擴大為原來的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //檢查新容量是否小于最小需要容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //再次檢查新容量是否大于最大容量
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

 private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
1.4 ArrayList序列化
  • ArrayList底層是由數(shù)組實現(xiàn)巷送,并且可以動態(tài)擴容驶忌,因此,保存元素的數(shù)組不一定全部會使用,也就不需要全部進行序列化
  • ArrayList中提供了writeObject()和readObject來序列化或反序列化數(shù)組中有保存元素的那一部分付魔,具體使用如下
//序列化
ArrayList list = new ArrayList();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(list);

//反序列化
ArrayList list = new ArrayList();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
ois.readObject(list);

2.Vector

2.1.Vector集合特點
  • [可容納類型] :只能容納引用對象(基本類型需要轉換為封裝類)
  • [線程安全] :線程安全(通過方法上添加syncronized關鍵字保證)
  • [底層實現(xiàn)] :底層使用數(shù)組實現(xiàn)聊品,與ArrayList一樣,有以下特點:初始化時需要聲明長度几苍,超出長度需要擴容翻屈,不適合頻繁的移動、刪除元素妻坝,搜索元素快
  • [元素可重復] :可重復

3.LinkedList

3.1.LinkedList集合特點
  • [可容納類型] :只能容納引用對象(基本類型需要轉換為封裝類)
  • [線程安全] :線程不安全
  • [底層實現(xiàn)] :底層使用鏈表實現(xiàn)伸眶,有以下特點:不用聲明長度,搜索元素慢刽宪,但是插入厘贼、刪除速度快。
  • [元素可重復] :可重復

4.ArrayList圣拄、Vector嘴秸、LinkedList對比

  • 這三種類型的集合都是有序集合,即遍歷時輸出順序和保存順序一致庇谆。在功能上表現(xiàn)也很相似岳掐,都提供了根據(jù)角標進行查詢、刪除饭耳、插入元素操作串述,都提供迭代器進行遍歷等。但是由于底層設計的區(qū)別寞肖,在性能纲酗、線程安全方面存在差異
  • Vector是線程安全的,ArrayList和LinkedList都是線程不安全的逝淹。Vector的線程安全是通過在方法上添加syncronized關鍵字來實現(xiàn)的耕姊,如果不是一定要保證線程安全,不推薦使用栅葡。
  • LinkedList 底部使用鏈表實現(xiàn)茉兰,它不需要像ArrayList、Vector一樣需要去動態(tài)調(diào)整容量
  • Vector和ArrayList的擴容機制略有不同:Vector初始大小為10欣簇,當保存元素數(shù)組大小不夠時规脸,會根據(jù)capacityIncrement進行區(qū)分,如果capacityIncrement大于0熊咽,則將數(shù)組大小擴充為現(xiàn)有的size+capacityIncrement莫鸭,如果capacityIncrement小于0,則擴容為size*2

5.list的使用場景分析

  • Vector和ArrayList底層使用動態(tài)數(shù)組實現(xiàn)横殴,天然適合隨機查詢和迭代遍歷操作被因,但是在刪除卿拴、添加元素時,性能較差梨与。
  • LinkedList 進行節(jié)點插入堕花、刪除卻要高效得多,但是隨機訪問性能則要比動態(tài)數(shù)組慢粥鞋。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缘挽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呻粹,更是在濱河造成了極大的恐慌壕曼,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件等浊,死亡現(xiàn)場離奇詭異腮郊,居然都是意外死亡,警方通過查閱死者的電腦和手機筹燕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門伴榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庄萎,你說我怎么就攤上這事√涟玻” “怎么了糠涛?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兼犯。 經(jīng)常有香客問我忍捡,道長,這世上最難降的妖魔是什么切黔? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任砸脊,我火速辦了婚禮,結果婚禮上纬霞,老公的妹妹穿的比我還像新娘凌埂。我一直安慰自己,他們只是感情好诗芜,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布瞳抓。 她就那樣靜靜地躺著,像睡著了一般伏恐。 火紅的嫁衣襯著肌膚如雪孩哑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天翠桦,我揣著相機與錄音横蜒,去河邊找鬼。 笑死,一個胖子當著我的面吹牛丛晌,可吹牛的內(nèi)容都是我干的仅炊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼茵乱,長吁一口氣:“原來是場噩夢啊……” “哼茂洒!你這毒婦竟也來了?” 一聲冷哼從身側響起瓶竭,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤督勺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斤贰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體智哀,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年荧恍,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓷叫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡送巡,死狀恐怖摹菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骗爆,我是刑警寧澤次氨,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站摘投,受9級特大地震影響煮寡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀呼,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一幸撕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧外臂,春花似錦坐儿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跃须,卻和暖如春站叼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇民。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工尽楔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留投储,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓阔馋,卻偏偏與公主長得像玛荞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呕寝,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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