1. 程式人生 > >List介面常用實現類的特點和底層實現

List介面常用實現類的特點和底層實現

List介面常用的實現類有3個:ArrayList、LinkedList、Vector。

那麼它們的特點和底層實現有哪些呢?

ArrayList特點和底層實現

ArrayList底層是用陣列實現的儲存。

特點:查詢效率高,增刪效率低,執行緒不安全。我們一般使用它。


圖1

檢視原始碼,我們可以看出ArrayList底層使用Object陣列來儲存元素資料。所有的方法,都圍繞這個核心的Object陣列來開展。

ArrayList是可以存放任意數量的物件,陣列長度是有限的,那麼是怎麼實現的呢?

本質上就是通過定義新的更大的陣列,將舊陣列內容拷貝到新陣列,來實現擴容。

ArrayList的Object陣列初始化長度為10,如果我們儲存滿了這個陣列,需要儲存第11個物件,就會定義新的陣列長度長度更大的陣列,並將將原陣列內容和新的元素一起加入到新陣列中,原始碼中程式碼如下:

 public void   ensureCapacity(int   minCapacity) {

    modCount++;

    int   oldCapacity = elementData.length;

    if   (minCapacity > oldCapacity) {

        Object oldData[] =   elementData;

        int   newCapacity = (oldCapacity * 3)/2 + 1;

         if   (newCapacity < minCapacity)

       newCapacity = minCapacity;

            //   minCapacity is usually close to size, so this is a win:

            elementData =   Arrays.copyOf(elementData, newCapacity);

    }

}

LinkedList特點和底層實現

LinkedList底層用雙向連結串列實現的儲存。

特點:查詢效率低,增刪效率高,執行緒不安全。

雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料節點中都有兩個指標,分別指向前一個節點和後一個節點。 所以,從雙向連結串列中的任意一個節點開始,都可以很方便地找到所有節點。


每個節點都應該有3部分內容:

    class  Node {

       Node  previous;   //前一個節點

       Object  element;    //本節點儲存的資料

       Node  next;       //後一個節點

}

我們檢視LinkedList的原始碼,可以看到裡面包含了雙向連結串列的相關程式碼:


圖2

注:entry在英文中表示“進入、詞條、條目”的意思。在計算機英語中一般表示“項、條目”的含義。

Vector向量

Vector底層用陣列實現的List,相關的方法都加了同步檢查,因此“執行緒安全,效率低”。 比如,indexOf方法就增加了synchronized同步標記。


【圖3】Vector的原始碼(indexOf方法)

建議

如何選用ArrayList、LinkedList、Vector?

·執行緒安全時,用Vector。

· 區域性變數不存線上程安全問題時,並且查詢較多用ArrayList(一般使用它)

·區域性變數不存線上程安全問題時,增加或刪除元素較多用LinkedList。