1. 程式人生 > >ArrayList與Vector異同

ArrayList與Vector異同

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()方法進行擴容。

    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);
    }
ArrayList中的方法都沒有加鎖,故ArrayList是執行緒不安全的。
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是執行緒安全的。

兩者區別
  1. Vector比ArrayList多出一個構造方法,這個構造方法可以設定擴容因子,而ArrayList不能。
  2. Vector與ArrayList底層都是採用陣列實現,當容量不足時,兩者擴容機制不同。ArrayList設定新容量為當前容量的1.5倍;Vector首先看構造方法中傳入的擴容因子是為0,如果為0,則設定新容量為當前容量的兩倍,如果不為0,則設定新容量為當前容量+擴容因子。
  3. Vector是執行緒安全的,而ArrayList不是。