24-JUC中常見的集合

集合圖

在這裏插入圖片描述

主體內容包括Collection集合和Map類;而Collection集合又可以劃分爲List(隊列)和Set(集合)。

List的實現類

List的實現類主要有: LinkedList, ArrayList, Vector, Stack。

  • LinkedList是雙向鏈表實現的雙端隊列;它不是線程安全的,只適用於單線程。
  • ArrayList是數組實現的隊列,它是一個動態數組;它也不是線程安全的,只適用於單線程。
  • Vector是數組實現的矢量隊列,它也一個動態數組;不過和ArrayList不同的是,Vector是線程安全的,它支持併發。
  • Stack是Vector實現的棧;和Vector一樣,它也是線程安全的。

Set的實現類

Set的實現類主要有: HastSet和TreeSet。

  • HashSet 是一個沒有重複元素的集合,它通過HashMap實現的;HashSet不是線程安全的,只適用於單線程。
  • TreeSet也是一個沒有重複元素的集合,不過和HashSet不同的是,TreeSet中的元素是有序的;它是通過TreeMap實現的;TreeSet也不是線程安全的,只適用於單線程。

Map的實現類

Map的實現類主要有: HashMap,WeakHashMap, Hashtable和TreeMap。

  • HashMap是存儲“鍵-值對”的哈希表;它不是線程安全的,只適用於單線程。
  • WeakHashMap是也是哈希表;和HashMap不同的是,HashMap的“鍵”是強引用類型,而WeakHashMap的“鍵”是弱引用類型,也就是說當WeakHashMap 中的某個鍵不再正常使用時,會被從WeakHashMap中被自動移除,WeakHashMap也不是線程安全的,只適用於單線程。
  • Hashtable也是哈希表;和HashMap不同的是,Hashtable是線程安全的,支持併發。
  • TreeMap也是哈希表,不過TreeMap中的“鍵-值對”是有序的,它是通過R-B Tree(紅黑樹)實現的;TreeMap不是線程安全的,只適用於單線程。

JUC集合包中的List和Set

JUC集合包中的List和Set實現類包括: CopyOnWriteArrayList, CopyOnWriteArraySet和ConcurrentSkipListSet

  • CopyOnWriteArrayList相當於線程安全的ArrayList,它實現了List接口。CopyOnWriteArrayList是支持高併發的
  • CopyOnWriteArraySet相當於線程安全的HashSet,它繼承於AbstractSet類。CopyOnWriteArraySet 內部包含一個CopyOnWriteArrayList對象(聚合關係),它是通過CopyOnWriteArrayList實現的
  • ConcurrentSkipListSet是線程安全的有序的集合(相當於線程安全的TreeSet);它繼承於AbstractSet,並實現了NavigableSet接口。ConcurrentSkipListSet是通過ConcurrentSkipListMap實現的,它也支持併發。

JUC集合包中Map

JUC集合包中Map的實現類包括: ConcurrentHashMap和ConcurrentSkipListMap

  • ConcurrentHashMap是線程安全的哈希表(相當於線程安全的HashMap);它繼承於AbstractMap類,並且實現ConcurrentMap接口。ConcurrentHashMap是通過“鎖分段”來實現的,它支持併發
  • ConcurrentSkipListMap是線程安全的有序的哈希表(相當於線程安全的TreeMap); 它繼承於AbstractMap類,並且實現ConcurrentNavigableMap接口。ConcurrentSkipListMap是通過“跳錶”來實現的,它支持併發。

JUC包中Queue

  • ArrayBlockingQueue是數組實現的線程安全的有界的阻塞隊列。
  • LinkedBlockingQueue是單向鏈表實現的(指定大小)阻塞隊列,該隊列按 FIFO(先進先出)排序元素。
  • LinkedBlockingDeque是雙向鏈表實現的(指定大小)雙向併發阻塞隊列,該阻塞隊列同時支持FIFO(先進先出)和FILO(先進後出)兩種操作方式。
  • ConcurrentLinkedQueue是單向鏈表實現的無界隊列,該隊列按 FIFO(先進先出)排序元素。
  • ConcurrentLinkedDeque是雙向鏈表實現的無界隊列,該隊列同時支持FIFO(先進先出)和FILO(先進後出)兩種操作方式。

ConcurrentHashMap

功能和HashMap基本一致,內部使用紅黑樹實現的。
特性:

  • 迭代結果和存入順序不一致
  • key和value都不能爲空
  • 線程安全的

ConcurrentSkipListMap

內部使用跳錶實現的,放入的元素會進行排序,排序算法支持2種方式來指定:

  1. 通過構造方法傳入一個Comparator
  2. 放入的元素實現Comparable接口

上面2種方式必選一個,如果2種都有,走規則1。

特性:

  • 迭代結果和存入順序不一致
  • 放入的元素會排序
  • key和value都不能爲空
  • 線程安全的

CopyOnWriteArrayList

實現List的接口的,一般我們使用ArrayList、LinkedList、Vector,其中只有Vector是線程安全的,可以使用Collections靜態類的synchronizedList方法對ArrayList、LinkedList包裝爲線程安全的List,不過這些方式在保證線程安全的情況下性能都不高。

CopyOnWriteArrayList是線程安全的List,內部使用數組存儲數據,集合中多線程並行操作一般存在4種情況:讀讀、讀寫、寫寫、寫讀,這個只有在寫寫操作過程中會導致其他線程阻塞,其他3種情況均不會阻塞,所以讀取的效率非常高。

可以看一下這個類的名稱:CopyOnWrite,意思是在寫入操作的時候,進行一次自我複製,換句話說,當這個List需要修改時,並不修改原有內容(這對於保證當前在讀線程的數據一致性非常重要),而是在原有存放數據的數組上產生一個副本,在副本上修改數據,修改完畢之後,用副本替換原來的數組,這樣也保證了寫操作不會影響讀

特性:

  • 迭代結果和存入順序一致
  • 元素不重複
  • 元素可以爲空
  • 線程安全的
  • 讀讀、讀寫、寫讀3種情況不會阻塞;寫寫會阻塞
  • 無界的

ConcurrentSkipListSet

有序的Set,內部基於ConcurrentSkipListMap實現的,放入的元素會進行排序,排序算法支持2種方式來指定:

  1. 通過構造方法傳入一個Comparator
  2. 放入的元素實現Comparable接口
    上面2種方式需要實現一個,如果2種都有,走規則1

特性:

  • 迭代結果和存入順序不一致
  • 放入的元素會排序
  • 元素不重複
  • 元素不能爲空
  • 線程安全的
  • 無界的

CopyOnWriteArraySet

內部使用CopyOnWriteArrayList實現的,將所有的操作都會轉發給CopyOnWriteArrayList。

特性:

  • 迭代結果和存入順序不一致
  • 元素不重複
  • 元素可以爲空
  • 線程安全的
  • 讀讀、讀寫、寫讀 不會阻塞;寫寫會阻塞
  • 無界的

ConcurrentLinkedQueue

高效併發隊列,內部使用鏈表實現的。
特性:

  • 線程安全的
  • 迭代結果和存入順序一致
  • 元素可以重複
  • 元素不能爲空
  • 線程安全的
  • 無界隊列

Deque

雙向隊列(Deque)是Queue的一個子接口,雙向隊列是指該隊列兩端的元素既能入隊(offer)也能出隊(poll),如果將Deque限制爲只能從一端入隊和出隊,則可實現棧的數據結構。對於棧而言,有入棧(push)和出棧(pop),遵循先進後出原則。

一個線性 collection,支持在兩端插入和移除元素。名稱 deque 是“double ended queue(雙端隊列)”的縮寫,通常讀爲“deck”。大多數 Deque 實現對於它們能夠包含的元素數沒有固定限制,但此接口既支持有容量限制的雙端隊列,也支持沒有固定大小限制的雙端隊列。

此接口定義在雙端隊列兩端訪問元素的方法。提供插入、移除和檢查元素的方法。每種方法都存在兩種形式:一種形式在操作失敗時拋出異常,另一種形式返回一個特殊值(null 或 false,具體取決於操作)。插入操作的後一種形式是專爲使用有容量限制的 Deque 實現設計的;在大多數實現中,插入操作不能失敗.

在這裏插入圖片描述

此接口擴展了 Queue接口。在將雙端隊列用作隊列時,將得到 FIFO(先進先出)行爲。將元素添加到雙端隊列的末尾,從雙端隊列的開頭移除元素。從 Queue 接口繼承的方法完全等效於 Deque 方法,如下表所示:

在這裏插入圖片描述

ConcurrentLinkedDeque

實現了Deque接口,內部使用鏈表實現的高效的併發雙端隊列。
特性:

  • 線程安全的
  • 迭代結果和存入順序一致
  • 元素可以重複
  • 元素不能爲空
  • 線程安全的
  • 無界隊列

參考

第26篇:學會使用JUC中常見的集合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章