Vector原始碼分析

2021-10-05 03:51:33 字數 2652 閱讀 6917

說實話vector在工作中用的比較少,至少我沒有用到過。vector在面試中經常用來和arraylist進行比較,但凡知道

vector的都應該知道vector是執行緒安全的,而arraylist是執行緒不安全的,究其原因其實就是因為vector在增、改、

刪操方法加了synchronized,利用鎖來保證執行緒安全。

vector也繼承了abstractlist,實現了list、randomaccess、cloneable、serializable等介面,和arraylist繼承關係是一樣的。vector類中變數:

/*

* 真正儲存元素的陣列

*/protected object[

] elementdata;

/** * 陣列中元素的真正個數

*/protected

int elementcount;

/** * 擴容時的增長係數,若為0,擴容時容量成倍增長

* 若不為0,擴容後容量:原來容量+capacityincrement

*/protected

int capacityincrement;

public

vector()

public

vector

(int initialcapacity)

public

vector

(int initialcapacity,

int capacityincrement)

4.1 add(e e)

可以看到add方法被synchronized 修飾,鎖就是當前物件(this)。
public

synchronized

boolean

add(e e)

private

void

ensurecapacityhelper

(int mincapacity)

private

void

grow

(int mincapacity)

4.2 addelement(e obj)

其實操作和前面的add(e e)是一樣的
public

synchronized

void

addelement

(e obj)

4.3 insertelementat(e obj, int index)

這裡有一點需要注意,elementcount是vector儲存元素的個數。
public

synchronized

void

insertelementat

(e obj,

int index)

//2.是否需要擴容

ensurecapacityhelper

(elementcount +1)

;//3.直接將index之後的元素copy到elementdata index之後的位置

system.

arraycopy

(elementdata, index, elementdata, index +

1, elementcount - index)

;//4.插入元素

elementdata[index]

= obj;

elementcount++

;}

public

synchronized e get

(int index)

有一點需要注意,修改elelmentdata中某個元素時,modcount並沒有自增。
public

synchronized e set

(int index, e element)

public

synchronized

void

removeelementat

(int index)

else

if(index <0)

int j = elementcount - index -1;

if(j >0)

elementcount--

; elementdata[elementcount]

= null;

}

對於vector的實現其實基本上和arraylist一樣的,只不過vector是執行緒安全,而arraylist是非執行緒安全的;vector擴容方式和arraylist的擴容方式不同,vector有擴容因子,而arraylist是直接1.5倍擴容。

Vector原始碼分析

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

vector原始碼分析

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

Vector原始碼分析

vector資料結構是陣列。1 繼承abstractlist,實現了list。因此底層的資料結構是陣列。2 實現了介面randomaccess,表明可以隨機訪問元素。3 實現了介面cloneable,表示可以進行轉殖。2 實現了介面serializable,表明可以序列化 儲存的集合元素 prote...