Vector原始碼分析

2021-10-20 17:44:49 字數 4778 閱讀 3297

vector資料結構是陣列。

1 繼承abstractlist,實現了list。因此底層的資料結構是陣列。

2 實現了介面randomaccess,表明可以隨機訪問元素。

3 實現了介面cloneable,表示可以進行轉殖。

2 實現了介面serializable,表明可以序列化

//儲存的集合元素

protected object[

] elementdata;

//元素的數量

protected

int elementcount;

//vector容器,當該值大於容器的長度的時候,會增加長度,增量就是該值。

protected

int capacityincrement;

//構造乙個存在初始容量、增量的vector

public

vector

(int initialcapacity,

int capacityincrement)

/** * 構造乙個初始容量的vector.增量為0.此時如果陣列元素滿了之後就需要2倍擴容

*/public

vector

(int initialcapacity)

/** *設定初始容量為10

*/public

vector()

//構造vector容器。直接儲存集合

public

vector

(collection<

?extends

e> c)

else

}

//往集合的尾部插入元素

public

synchronized

boolean

add(e e)

private

void

add(e e, object[

] elementdata,

int s)

//再來看看擴容操作的實現,內部呼叫grow()方法

private object[

]grow()

private object[

]grow

(int mincapacity)

//繼續內部呼叫了arrays.copyof(elementdata,newcapacity(mincapacity)

//我們看下newcapacity(mincapacity)操作。

private

intnewcapacity

(int mincapacity)

return

(newcapacity - max_array_size <=0)

? newcapacity

:hugecapacity

(mincapacity);}

//擴容完成之後複製陣列即可。

//往特定位置插入資料

public

void

add(

int index, e element)

public

synchronized

void

insertelementat

(e obj,

int index)

modcount++

;//獲取集合元素個數

final

int s = elementcount;

object[

] elementdata =

this

.elementdata;

if(s == elementdata.length)

elementdata =

grow()

;//把原來集合index之後的資料複製到新的陣列。

system.

arraycopy

(elementdata, index,

elementdata, index +1,

s - index)

;//然後給新的位置重新賦值

elementdata[index]

= obj;

elementcount = s +1;

}//新增乙個集合

public

boolean

addall

(collection<

?extends

e> c)

}//往指定位置插入乙個集合。

/** * 其實就是計算插入集合的長度

*/public

synchronized

boolean

addall

(int index, collection<

?extends

e> c)

//尾部插入

public

synchronized

void

addelement

(e obj)

//返回集合的容量

public

synchronized

intcapacity()

//刪除所有的元素。內部呼叫removeallelements

public

void

clear()

public

synchronized

void

removeallelements()

//public

synchronized

intindexof

(object o,

int index)

else

return-1

;}//是否包含元素

public

boolean

contains

(object o)

//是否包含乙個集合。父類abstractcollection實現。

public

synchronized

boolean

containsall

(collection<

?> c)

public

boolean

containsall

(collection<

?> c)

//將集合的元素複製到目標陣列中

public

synchronized

void

copyinto

(object[

] anarray)

//返回指定位置的元素,內部呼叫elementdata(index)實現

public

synchronized e elementat

(int index)

return

elementdata

(index);}

//設定最小容量。

public

synchronized

void

ensurecapacity

(int mincapacity)

}//獲取第乙個元素

public

synchronized e firstelement()

return

elementdata(0

);}//獲取指定位置的元素

public

synchronized e get

(int index)

//獲取元素第一次出現的位置。從index位置開始向後查詢

public

synchronized

intindexof

(object o,

int index)

else

return-1

;}//指定的位置插入元素。陣列移動

public

synchronized

void

insertelementat

(e obj,

int index)

modcount++

;final

int s = elementcount;

object[

] elementdata =

this

.elementdata;

if(s == elementdata.length)

elementdata =

grow()

; system.

arraycopy

(elementdata, index,

elementdata, index +1,

s - index)

; elementdata[index]

= obj;

elementcount = s +1;

}//判斷集合是否為空,為空則true

public

synchronized

boolean

isempty()

//獲取最後乙個元素

public

synchronized e lastelement()

return

elementdata

(elementcount -1)

;}

1 vector資料結構是陣列

2 擴容的時候一般是在初始化容器的時候指定擴容增量,如果增量為空,那麼2倍擴容。和arraylist的1.5倍擴容不同

3 api都用synchronized修飾,執行緒安全,但是效率較低

4 存在特殊迭代器enumeration

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...