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
}
1 vector資料結構是陣列//往集合的尾部插入元素
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)
;}
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...