Vector詳解及原始碼分析

2021-09-05 01:24:57 字數 1858 閱讀 6841

vector與arraylist一樣,同屬於abstractlists的子類,但與arraylist不同的是,它對於內部對元素的操作方法都是同步的,即執行緒安全的,但隨之而來的就是效率問題,它的操作效率會略低於arraylist

//vector內部維護的陣列,用於儲存元素

protected object elementdata;

//儲存元素的長度大小

protected int elementcount;

//擴容增長量,預設是0,當是0時,每次擴容按原量的1倍擴;若大於0,就按該量來擴容

protected int capacityincrement;

//確定初始容量的大小,及擴容增長量

public vector(int initialcapacity, int capacityincrement)

//確定初始容量大小,並設定擴容增長量為0,這種情況下,每次擴容會擴容至原來的2倍

public vector(int initialcapacity)

//無參構造方法,設定初容量大小為10

public vector()

//將集合複製給elementdata

public vector(collection extends e> c)

add(e e);

public synchronized boolean add(e e)
首先,操作次數加一

呼叫ensurecapacityhelper(int mincapacity),引數為當前元素的數量加一

private void ensurecapacityhelper(int mincapacity)
該方法是判斷是否需要擴容,如果增長之後的元素數量大於陣列的大小,即需要擴容,呼叫grow(int mincapacity)方法

private void grow(int mincapacity)
該方法就是擴容的方法,這裡就用到了之前建構函式指定的擴容增長量:①capacityincrement 。如果該量大於0,就增加該量的大小;如果該量小於等於0,則擴容至原量的2倍

②如果擴容之後的量還是小於新增元素之後的容量大小,就擴容至增加元素之後的容量大小

③複製陣列

將元素賦到陣列中

remove(object o)

public boolean remove(object o) 

public synchronized boolean removeelement(object obj)

return false;

}public synchronized void removeelementat(int index)

else if (index < 0)

int j = elementcount - index - 1;

if (j > 0)

elementcount--;

elementdata[elementcount] = null; /* to let gc do its work */

}

跟arraylist一樣,最重要的就是理解擴容機制。

刪除方法跟增加方法差不多,都是通過複製陣列的方式對元素進行操作,而這裡就是arraylist、vector與linkedlist對於增刪操作效率差異的原因了。

Vector原始碼分析

與arraylist一樣,vector的底層也是使用陣列elementdata進行儲存資料 protected object elementdata 當前elementdata陣列中元素的個數 protected int elementcount 當前elementdata陣列進行擴容的增量 pro...

Vector原始碼分析

說實話vector在工作中用的比較少,至少我沒有用到過。vector在面試中經常用來和arraylist進行比較,但凡知道 vector的都應該知道vector是執行緒安全的,而arraylist是執行緒不安全的,究其原因其實就是因為vector在增 改 刪操方法加了synchronized,利用鎖...

vector原始碼分析

vector和arraylist操作基本相同,只不過對方法加了synchronized做同步處理,以add方法為例 擴容重點步驟 確定擴容的大小 private intnewcapacity int mincapacity return newcapacity max array size 0 ne...