問題

HashSet基於HashMap.

如果我們看HashSet<E>實現,一切都是在HashMap<E,Object>下管理的。

<E>被用作 HashMap 的鍵。

我們知道HashMap不是執行緒安全.這就是為什麼我們在Java中有ConcurrentHashMap.

基於這個,我很困惑為什麼我們沒有一個ConcurrentHashSet,它應該基於ConcurrentHashMap?

還有什麼我缺少的嗎?我需要在多執行緒環境中使用Set.

另外,如果我想建立我自己的ConcurrentHashSet我可以透過將HashMap替換為ConcurrentHashMap來實現它並保留其餘的?

  最佳答案

ConcurrentHashSet沒有內建型別,因為您總是可以從地圖中獲得一組.由於有許多型別的地圖,您使用方法從給定的地圖(或地圖類)生成集合.

在 Java 8 之前,透過使用 Collections.newSetFromMap(map) 生成一個由併發雜湊對映支援的併發雜湊集。

在Java 8(由@Matt指出)中,您可以透過 ConcurrentHashMap.newKeySet() 獲得併發雜湊集檢視.這比舊的newSetFromMap要求您傳入空地圖物件有點簡單.但它特定於ConcurrentHashMap.

無論如何,Java設計師每次建立新的地圖介面時都可以建立一個新的集合介面,但是當第三方建立自己的地圖時,該模式將不可能強制執行.最好是使用源自新集的靜態方法;即使您建立自己的地圖實現,該方法總是有效的.

  相同標籤的其他問題

javacollectionsconcurrencyhashmaphashset