HashSet は HashMap に基づいています。
HashSet<E>
実装を見ると、すべてが の下で管理されていますHashMap<E,Object>
。
<E>
のキーとして使用されますHashMap
。
HashMap
そして、それがスレッドセーフではないことはわかっています。それがConcurrentHashMap
Java に備わっている理由です。
これを踏まえると、に基づくべき ConcurrentHashSet がなぜ存在しないのか疑問に思います。ConcurrentHashMap
他に何か見落としているものはありますか?Set
マルチスレッド環境で使用する必要があります。
また、独自のものを作成したい場合は、を置き換えて残りをそのままにしておくだけConcurrentHashSet
で実現できますか?HashMap
ConcurrentHashMap
ベストアンサー1
には組み込み型がありません。これは、マップからConcurrentHashSet
常にセットを派生できるためです。マップには多くの種類があるため、特定のマップ (またはマップ クラス) からセットを生成するにはメソッドを使用します。
Java 8より前では、並行ハッシュマップに基づく並行ハッシュセットを生成するには、Collections.newSetFromMap(map)
Java 8では(@Mattが指摘)、次のようにして並行ハッシュセットビューを取得できます。ConcurrentHashMap.newKeySet()
newSetFromMap
これは、空のマップ オブジェクトを渡す必要があった以前の方法よりも少し単純です。ただし、これは に固有のものですConcurrentHashMap
。
いずれにせよ、Java 設計者は、新しいマップ インターフェースが作成されるたびに新しいセット インターフェースを作成することもできましたが、サード パーティが独自のマップを作成する場合、そのパターンを強制することは不可能です。新しいセットを派生する静的メソッドを用意する方が適切です。このアプローチは、独自のマップ実装を作成する場合でも常に機能します。