vector集合與arraylist相似,但是vector是執行緒安全的。
vector集合使用synchronized關鍵字進行同步,達到執行緒安全,例如add,remove方法
public
synchronized
boolean
add(e e)
public
synchronized
void
addelement
(e obj)
public
synchronized
boolean
removeelement
(object obj)
return
false
;}
在進行add操作的時候,如果達到當前陣列大小,需要進行擴容操作,在進行擴容操作的時候跟arraylist差不多,但是vector集合是判斷(mincapactity-oldcapacity)和(capacityincrement或oldcapacity)進行大小比較,而arraylist後者是oldcapacity/2
private
void
add(e e, object[
] elementdata,
int s)
private object[
]grow
(int mincapacity)
capacityincrement可以通過建構函式賦值
capacityincrement本身是沒有賦值預設為0,在建構函式的時候可以為它賦值
public
vector
(int initialcapacity,
int capacityincrement)
而預設的無參建構函式會呼叫乙個引數的建構函式,然後乙個引數的構造函式呼叫上面的建構函式(套娃無窮盡也)
public
vector()
public
vector
(int initialcapacity)
1.vector通過synchronized關鍵字進行同步,屬於執行緒安全,而arraylist非執行緒安全,因此vector的開銷也比arraylist大。
2.vector擴容首先判斷是否存在capacityincrement,不存在就用最小增長跟oldcapacity進行對比,而arraylist是最小增長跟oldcapacity/2進行對比。
1.可以使用 collections.synchronizedlist()(也是獲得乙個通過synchronized關鍵字同步的list)獲取乙個執行緒安全的list
2.使用concurrent並發包下面的copyonwritearraylist類
在進行寫操作的時候是先copy乙個陣列然後在新陣列上面進行修改,然後替換原陣列
public
boolean
add(e e)
}
讀在原陣列上面直接操作
@suppresswarnings
("unchecked"
)static
e elementat
(object[
] a,
int index)
優點copyonwritearraylist在寫的同時支援讀的操作,大大提公升了讀的效能,適用於讀多寫少的場景。
但是優點又是缺點:
1.記憶體占用大:讀寫分離,每次都要拷貝乙個新的陣列,因此記憶體占用大
2.資料不一致:在讀的時候不能夠實時的讀取別人正在寫的資料,因為部分的寫操作的資料還未同步到記憶體中
小結:copyonwritearraylist適用於讀多寫少,同時記憶體不敏感,以及實時性要求低的場景。
總結:vector與arraylist十分相似,但是vector是執行緒安全的,與arraylist擴容時,選擇的擴容大小也不一樣。vector可以用collections.synchronizedlist()或者使用concurrent包中的copyonwritearraylist替代(適合場景比較少)
ps:最近要找房子好累啊
第九天 補打卡
這個題目和前面那個有點像,所以我還是用前面那種方式解決問題,遍歷,將不等於給定值的交換,如下 class solution object def removeelement self,nums,val if len nums 0 return 0 is tihan 0 for i in range ...
集訓第九天
今天就看了乙個迪傑斯特拉演算法,他的方法就是從乙個頂點出發,找出這個到與它相關頂點的所有路徑,然後在找出其中最小的,作為基量,一次類推 如下 include define inf 0x7fffffff define maxn 50 int matrix maxn maxn void dijkstra...
開課第九天
畫布 1今天是開課第九天,上午講了關於方法的題,下午講了新知識,嗯,今天有點熱,下面就是本寶寶今天的收穫 1 過載 方法名相同,引數列表不同叫做過載,和返回值型別無關。過載方法名必須一致,引數列表不同,和返回值型別無關。引數列表不同 個數不同,順序不同,型別不同 方法過載的時候編譯器會自動找到最適合...