1.arraylist在預設容量是10,每次進行add的時候會檢查容量,如果需要擴容則增加1.5倍,如果仍然小,則設為增加後的長度大小
2.copyonwritearraylist 保證執行緒安全的方法是:不對讀進行限制,寫的操作加重入鎖,寫的時候拷貝乙份陣列,並將新資料寫入,完成後再將引用返回。
重新設定引用是乙個原子操作。適用於寫的操作比較少,重點為讀操作的併發情況。 在迭代的時候,由於寫操作不會更改當前迭代器的容器引用,因此不 會有concurrent異常。
3. collections.synchronizedlist : 對每個方法(迭代器除外)加了物件鎖。所以在進行單次呼叫list方法的時候保證執行緒安全。但是可能會存在競態條件。所以客戶端進行
使用的時候要注意加外部鎖。乙個典型的例子是,自動以乙個方法,需要先呼叫list的讀方法,再改寫list,雖然兩個方法都是執行緒安全的,但是在兩個方法呼叫 期間可能會有其他執行緒對list進行修改,這會導致迭代器最終丟擲異常。此時需要在客戶端方法上新增synchronize(list)進行外部加鎖,這樣可以保證兩個操作 之間不會有其他執行緒修改list(方法的物件鎖不能使自定義的類,這樣沒有辦法阻止其他執行緒訪問list) 此競態條件也會出現在其他併發容器中,包括上面那一條
相比於copyonwritearraylist,寫的效率明顯更高,讀的效率略微下降
容器3的迭代器是不安全的!
4.hashmap
預設大小是16,且容量必須是2的次冪,有最大值為2的30次冪。預設因子為0.75,為擴容的臨界係數。
底層資料結構為乙個陣列,每個元素存乙個鍊錶,鍊錶元素為entry。 定位元素的過程是: 1.通過key的hashcode值來計算出乙個新的hash值(防止原來的 hashcode寫的不好),通過新的hash和底層陣列table的長度來定位index
2.通過index找到陣列中的第乙個entry元素. 迴圈鍊錶查詢是否有key與當前元素相同。 判斷相同的方法為:先判斷hash值是否相同,在判斷equals和==。
所以自定義類的時候,如果要用到map,切記重寫hashcode和equals方法
hashmap為什麼是執行緒不安全的:當新增或刪除的時候,如果操作的key的hash值一樣,會導致多個執行緒對同乙個鍊錶進行操作(結構改變),這會導致後乙個線 程的操作覆蓋前乙個執行緒(1.同時在鍊錶上新增entry 2.同時刪除enry 3.重新分配雜湊表,陣列結構更新)
5.linkedhashmap :可以預知排序順序,兩種:插入時的順序,或者是訪問的順序
entry的資料結構比hashmap中的entry多了兩個變數,before和after,以此來建立entry的鍊錶
實際上就是乙個hashmap+linklist
在底層資料結構中增加了乙個雙向鍊錶來儲存entry引用,設立乙個boolean的標誌位,來決定是已插入順序儲存還是最近訪問順序儲存
若以訪問順序儲存,則每次操作乙個節點後,調整鍊錶順序。
6.treemap:
7.concurrentskiplistmap:
對高併發有較好的支援,底層實現是利用跳表的資料結構。entry是排序的。查詢等操作的時間複雜度是log(n)。
利用cas方法保證執行緒安全
容器的三種安全併發方式比較
1.copyonwrite
寫操作加鎖,並在乙個副本上進行寫操作,同時讀操作不加鎖,讀的時候讀的是原始容器。寫操作執行的最後一步是給引用賦值最新的副本容器,這是乙個原始操作。
由於整合體系不同,他沒有modelcount變數,因此不會丟擲快速失敗異常
效能上,寫操作效能差,讀操作效能高
2.collections.synchronized
對非安全容器內部方法加鎖,迭代器不加鎖。所以,在用容器內部迭代器時,另乙個執行緒的寫操作會導致迭代快速失敗。
寫效能高於copyonwrite,讀效能略低於前者
注:1和2繼承的體系完全不同,前者繼承了abstractlist骨架類,後者實現了randomaccess介面
3.concurrent(hashmap)
採用了分段鎖,將乙個table分成了若干segment,每個segment有自己的鎖,所以可以併發訪問不同的segment。
資料結構(以map為例):乙個hashentry節點中的key,next和hash都是final的,value是 volatile的,所以讀操作不需要加鎖
由於next是final的,所以remove必須先clone刪除點之前所有的節點,然後將最後乙個節點的next指向刪除點後乙個節點
插入必須在頭部插入
併發效率高,但若一致性。不會快速失敗,迭代實際上是迭代底層的陣列,已經迭代過的值改變不影響,未迭代的值變化則會體現在接下來的讀取中
高併發的時候盡量使用2和3,具體選擇根據讀寫情況決定
Java集合知識點總結
list有序且允許元素重複。map也屬於集合系統,但和collection介面沒關係。map是key對value的對映集合,其中key列就是乙個集合。key不能重複,但是value可以重複。sortedset和sortedmap介面對元素按指定規則排序,sortedmap是對key列進行排序。has...
Java集合知識點梳理
由collection介面派生的兩個介面是list和set,都可以使用迭代器來遍歷,它們都實現了iterator介面 一.list 實現list介面的常用類有linkedlist,arraylist,vector和stack,list允許有相同的元素。arraylist 基於陣列方式實現,無容量的限...
幾個知識點
1 記憶體對齊 2 mvc與ssh框架對應關係 3 面試相關 4 非c 內建型別a和b,在哪幾種情況下b能隱式轉化為a?case 4 賦值操作,雖不是正宗的隱式型別轉換,但也可以勉強算乙個 5 extern c 的慣用法 1 在c 中引用c語言中的函式和變數,在包含c語言標頭檔案 假設為cexamp...