List集合總結,對比分析ArrayList,Vector,LinkedList

前面已經寫了三篇關於Java集合的文章,包括:html

Java集合 ArrayList原理及使用java

再說Java集合,subList之於ArrayList數組

Java集合 LinkedList的原理及使用安全

關於Vector,它的實現和ArrayList很是相似,就再也不單開一個章節來說了,如今咱們來對Java集合作一個概括總結。框架

一. List框架圖

首先上面的框架圖能夠代表順序的關聯關係,但並不全面,如ArrayList在繼承了AbstractList抽象類的同時還實現了List接口。函數

  1. List是一個接口,繼承了Collection,同時Collection繼承了Iterable,代表List的實現類都是可用迭代遍歷的;
  2. AbstractList是一個抽象類,實現了List接口,同時繼承了AbstractCollection,針對一些經常使用方法,如add(),set(),remove(),給了默認實現,固然在具體的實現類中基本都重寫了,該類中沒有get(),size()方法。
  3. AbstractSequentialList是一個抽象類,繼承了AbstractList抽象類,實現了不少雙向鏈表中根據索引操做的方法。
  4. ArrayList、Vector、LinkedList、Stack都是具體的實現類。

二. ArrayList、Vector對比分析

類型 線程安全 內部結構 擴容規則 執行效率 序列化
ArrayList 數組Object[] 10 數組足夠最小長度*1.5
Vector 數組Object[] 10 默認數組足夠最小長度*2,可自定義每次擴容數量

Vertor擴容方法:大數據

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    //capacityIncrement參數可經過構造函數傳遞進來,若沒傳遞該參數,則數組大小設置爲elementData.length * 2
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    //擴容有上限
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

三. ArrayList、LinkedList對比分析

類型 內部結構 插入效率(正常狀況) 刪除效率(正常狀況) 順序遍歷效率 隨機遍歷效率 佔用內存 序列化
ArrayList 數組Object[]
LinkedList 雙向鏈表Node

上述的對比都是基於大數據量的狀況下,若是隻是幾個元素或幾十個元素,它們之間並無多大區別。線程


問:插入效率爲什麼說正常狀況下ArrayList低,LinkedList高呢?code

答:咱們清楚ArrayList之因此插入效率低,有兩個緣由會形成時間的消耗。htm

​ 第一,當底層數組空間不足時須要擴容,擴容後需進行數組拷貝

​ 第二,當不在數組末尾插入數據,那麼就須要移動數組元素

​ 知道了其插入效率低的緣由後,那麼很明顯,數據擴容及拷貝只有在數組空間不足時才發生,若是咱們正確使用,就像《阿里巴巴Java開發手冊》中提到咱們在建立集合對象時,就傳遞參數預先設置好數組大小,那麼插入效率是很是高的;而90%的狀況下咱們在添加元素時都調用的是add(E e),直接在末尾添加元素,不多調用add(int index, E e)在數組中部添加元素,這樣其實移動數組元素就不多發生,所以插入效率也很高。


問:刪除效率爲什麼說正常狀況下ArrayList低,LinkedList高呢?

答:由於刪除效率高、低不是絕對的。其實刪除操做能夠分爲兩部分。

​ 第一:找到要刪除的元素,這個經過索引找,ArrayList的執行效率要遠高於LinkedList的執行效率;經過equals找則須要遍歷整個集合,ArrayList和LinkedList執行效率基本一致。

​ 第二:刪除元素及後續操做,這個若是刪除是最後一個元素,執行效率基本一致;若是是刪除的中間元素,那麼ArrayList需進行數組元素移動,而LinkedList只需搭建起該元素的上一個節點和下一個節點的關係便可,LinkedList執行效率高於ArrayList。

​ 所以,需根據實際狀況纔可判斷實際的執行效率。


問:遍歷效率這個問題怎麼說?

答:ArrayList經過數組實現,自然能夠經過數組下標讀取數據,順序遍歷、隨機遍歷效率都很是高;LinkedList經過雙向鏈表實現,順序遍歷時,可直接經過本節點.next()直接找到相關聯的下一個節點,效率很高,而若是LinkedList隨機遍歷時,首先需判斷(傳遞的索引值與集合長度/2)的大小,來肯定接下來是應該從第一個節點開始找仍是最後節點開始找,越是靠近集合中部、集合越大,隨機遍歷執行效率越低。


四. 總結

本文對List集合進行了總結,包括類結構圖,ArrayList和Vector對比分析,ArrayList和LinkedList的對比分析,如有不對之處,請批評指正,望共同進步,謝謝!

相關文章
相關標籤/搜索