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。