Java中Vector和ArrayList,LinkedList的區(qū)別

文章目錄

  • ArrayList 和 Vector 、LinkedLis t原理
  • ArrayList 和 Vector 部分源碼解析
  • ArrayList 和 Vector 、LinkedList 的使用
  • ArrayList 和 Vector 、LinkedList 區(qū)別總結(jié)
1.ArrayList 和 Vector 、LinkedLis t原理

首先List接口一共有三個實現(xiàn)類,分別是ArrayList、Vector和LinkedList。List用于存放多個元素,能夠維護元素的次序,并且允許元素的重復(fù)。3個具體實現(xiàn)類的相關(guān)區(qū)別如下:

(1).ArrayList是最常用的List實現(xiàn)類,內(nèi)部通過數(shù)組實現(xiàn)的,它允許對元素進行隨機訪問。數(shù)組的缺點是每個元素之間不能有間隔,當數(shù)組大小不滿足時需要增加存儲能力。當從ArrayList的中間位置插入或者刪除元素時,需要對數(shù)組進行復(fù)制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
(2).Vector與ArrayList一樣,也是通過數(shù)組實現(xiàn)的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠?qū)慥ector,但實現(xiàn)同步需要很高的花費,因此,訪問它比訪問ArrayList慢。
(3).LinkedList是采用鏈表結(jié)構(gòu)存儲數(shù)據(jù)的,很適合數(shù)據(jù)的動態(tài)插入和刪除,但隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用

2.ArrayList 和 Vector 部分源碼解析

(1).ArrayList:

public boolean add(E e) {

    ensureCapacity(size + 1);  // 增加元素,判斷是否能夠容納。不能的話就要新建數(shù)組
 
    elementData[size++] = e;

    return true;

}

 public void ensureCapacity(int minCapacity) {

    modCount++; 

    int oldCapacity = elementData.length;

    if (minCapacity > oldCapacity) {

        Object oldData[] = elementData; 
 
       int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的數(shù)組的大小
 
        if (newCapacity < minCapacity)

       newCapacity = minCapacity;

            // minCapacity is usually close to size, so this is a win:
 
            elementData = Arrays.copyOf(elementData, newCapacity);

    }
}

(2).Vector:

private void ensureCapacityHelper(int minCapacity) {

    int oldCapacity = elementData.length;

    if (minCapacity > oldCapacity) {

        Object[] oldData = elementData;

        int newCapacity = (capacityIncrement > 0) ?

       (oldCapacity + capacityIncrement) : (oldCapacity * 2); //增加新的數(shù)組空間

        if (newCapacity < minCapacity) {

       newCapacity = minCapacity;

        }

         elementData = Arrays.copyOf(elementData, newCapacity);

    }

}
3.ArrayList 和 Vector 、LinkedList 的使用

(1).Vector :

public class VectorDemo{ 
public static void main(String[] args){
    //Vector的創(chuàng)建 
    //使用Vector的構(gòu)造方法進行創(chuàng)建 
    Vector v = new Vector(4);
    //向Vector中添加元素 
    //使用add方法直接添加元素 
    v.add("Test0"); 
    v.add("Test1"); 
    v.add("Test0"); 
    v.add("Test2"); 
    v.add("Test2");
    //從Vector中刪除元素 
    v.remove("Test0"); //刪除指定內(nèi)容的元素 
    v.remove(0); //按照索引號刪除元素
    //獲得Vector中已有元素的個數(shù) 
    int size = v.size(); 
    System.out.println("size:" + size);
    //遍歷Vector中的元素 
    for(int i = 0;i < v.size();i++){ 
      System.out.println(v.get(i)); 
    } 
  } 
} 

(2).ArrayList :

ArrayList List = new ArrayList(); 
for( int i=0;i <10;i++ ) //給數(shù)組增加10個Int元素 
List.Add(i); 
//..程序做一些處理 
List.RemoveAt(5);//將第6個元素移除 
for( int i=0;i <3;i++ ) //再增加3個元素 
List.Add(i+20); 
Int32[] values = (Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的數(shù)組
int x=list.get(i) 查詢某個數(shù)據(jù)

(3).LinkedList :

用法實在太豐富了,這里就不詳細寫了,請參考這篇博客!!!
http://blog.csdn.net/i_lovefish/article/details/8042883
4.ArrayList 和 Vector 、LinkedList 區(qū)別總結(jié)

結(jié)合上面幾條關(guān)于ArrayList和Vector,LinkedList區(qū)別如下:

(1).ArrayList在內(nèi)存不夠時默認是擴展50% + 1個,Vector是默認擴展1倍。
(2).Vector提供indexOf(obj, start)接口,ArrayList沒有
(3).Vector屬于線程安全級別的,但是大多數(shù)情況下不使用Vector,因為線程安全需要更大的系統(tǒng)開銷
(4).如果查找一個指定位置的數(shù)據(jù),vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而如果移動一個指定位置的數(shù)據(jù)花費的時間為0(n-i)n為總長度,這個時候就應(yīng)該考慮到使用Linkedlist,因為它移動一個指定位置的數(shù)據(jù)所花費的時間為0(1),而查詢一個指定位置的數(shù)據(jù)時花費的時間為0(i)
(5).Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行向前或向后遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入數(shù)度較快

總的來說:
LinkedList:增刪改快
Vector:線程安全
ArrayList:查詢快(有索引的存在)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容