Vector原始碼分析

2021-09-13 13:51:05 字數 2106 閱讀 8960

//與arraylist一樣,vector的底層也是使用陣列elementdata進行儲存資料

protected object[

] elementdata;

//當前elementdata陣列中元素的個數

protected int elementcount;

//當前elementdata陣列進行擴容的增量

protected int capacityincrement;

//序列化版本號

private

static final long serialversionuid =

-2767605614048989439l;

小結:vector集合的底層為陣列,對vector集合的操作,其實就是對底層elementcount陣列的操作

vector構造方法有4個,分別是:

public

vector

(int initialcapacity, int capacityincrement)

public

vector

(int initialcapacity)

public

vector()

public

vector

(collection<

?extends

e> c)

小結:

接下來思路一樣,我們通過類似debug的形式呼叫add方法,新增第一元素,來分析vector在add元素時,新增元素以及擴容中,整個過程中原始碼的具體實現

//建立乙個vector集合,通過上面vector構造方法初始化,我們知道此時底層elementdata陣列,長度容量elementdata.length==10,元素個數elementcount==0,擴容增量capacityincrement==0

list strlist =

newvector

()

//新增第乙個元素

strlist.

add(

"我是第1個元素"

);

public synchronized boolean add

(e e)

注意:vector大量的方法基本上均加synchronized修飾,因此vector是執行緒安全的,而arraylist是沒有synchronized進行修飾的,因此arraylist不是執行緒安全,兩個集合之間的區別,在以後我們會進行分析對比,在這裡不做重點討論

private

void

ensurecapacityhelper

(int mincapacity)

小結:當元素個數小於elementdata.length時,vector此時不進行擴容,否則超過,則vector集合則進行擴容,當然從我們此時只add了第乙個元素,不會走下面的擴容grow(int mincapacity),但是當我們元素個數超過elementdata.length時,我們接著看看vector的擴容機制是怎麼實現的

注意:接下來的分析假設是add第11個元素,此時mincapacity - elementdata.length > 0,

mincapacity==11,傳入grow(11)

private

void

grow

(int mincapacity)

private

static final int max_array_size

= integer.

max_value-8

;private

static int hugecapacity

(int mincapacity)

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

Vector原始碼分析

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