ArrayList與Vector異同
阿新 • • 發佈:2018-12-26
List是一個介面,裡面宣告有操作“表”這一種資料結構的通用方法,具體實現類實現此介面後,根據實現的不同可對通用方法進行不同程度的擴充套件,它主要有四個實現類:ArrayList,LinkedList,Vector,Stack。ArrayList與Vector基於陣列實現,LinkedList基於雙向迴圈連結串列實現,Stack繼承於Vector。接下來介紹ArrayList與Vector的異同
ArrayList
ArrayList是基於陣列實現的一種順序表,採用線性連續空間儲存元素,它有三個構造方法:
public ArrayList(int initialCapacity) { //建立一個具有指定容量initialCapacity的空列表 } public ArrayList() { //建立一個具有預設容量(10)的空列表 } public ArrayList(Collection<? extends E> c) { //建立一個包含指定Collection的列表 }
ArrayList具有10的預設容量,每次使用add方法加入元素時,它首先會呼叫ensureCapacityInternal方法判斷容量是否足夠,如果容量不足,就需要呼叫grow()方法進行擴容。
ArrayList中的方法都沒有加鎖,故ArrayList是執行緒不安全的。private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//即相當於擴充套件至原容量的1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
Vector
Vector底層同樣是基於陣列實現,它有四個構造方法:
public Vector(int initialCapacity, int capacityIncrement) { //建立一個具有指定容量initialCapacity和指定擴容因子capacityIncrement的空列表 } public Vector(int initialCapacity) { } //建立一個具有預設容量(10)的空列表 } public Vector(Collection<? extends E> c) { //建立一個包含指定Collection的列表 } public Vector() { //建立一個具有指定容量initialCapacity和預設擴容因子(0)的空列表 }
Vector具有10的預設容量,每次使用add方法加入元素時,它首先會呼叫ensureCapacityHelper方法判斷容量是否足夠,如果容量不足,就需要呼叫grow()方法進行擴容。
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);//若擴容因子大於0,設定新容量為舊容量+擴容因子;否則就設定新容量為舊容量的兩倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
Vector中很多方法都加了synchronized進行同步,故Vector是執行緒安全的。兩者區別
- Vector比ArrayList多出一個構造方法,這個構造方法可以設定擴容因子,而ArrayList不能。
- Vector與ArrayList底層都是採用陣列實現,當容量不足時,兩者擴容機制不同。ArrayList設定新容量為當前容量的1.5倍;Vector首先看構造方法中傳入的擴容因子是為0,如果為0,則設定新容量為當前容量的兩倍,如果不為0,則設定新容量為當前容量+擴容因子。
- Vector是執行緒安全的,而ArrayList不是。