java集合幾個知識點

2021-08-07 14:54:44 字數 2458 閱讀 3229

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