ConcurrentHashMap に対して ConcurrentHashSet がないのはなぜですか? 質問する

ConcurrentHashMap に対して ConcurrentHashSet がないのはなぜですか? 質問する

HashSet は HashMap に基づいています。

HashSet<E>実装を見ると、すべてが の下で管理されていますHashMap<E,Object>

<E>のキーとして使用されますHashMap

HashMapそして、それがスレッドセーフではないことはわかっています。それがConcurrentHashMapJava に備わっている理由です。

これを踏まえると、に基づくべき ConcurrentHashSet がなぜ存在しないのか疑問に思いますConcurrentHashMap

他に何か見落としているものはありますか?Setマルチスレッド環境で使用する必要があります。

また、独自のものを作成したい場合は、を置き換えて残りをそのままにしておくだけConcurrentHashSetで実現できますか?HashMapConcurrentHashMap

ベストアンサー1

には組み込み型がありません。これは、マップからConcurrentHashSet常にセットを派生できるためです。マップには多くの種類があるため、特定のマップ (またはマップ クラス) からセットを生成するにはメソッドを使用します。

Java 8より前では、並行ハッシュマップに基づく並行ハッシュセットを生成するには、Collections.newSetFromMap(map)

Java 8では(@Mattが指摘)、次のようにして並行ハッシュセットビューを取得できますConcurrentHashMap.newKeySet()newSetFromMapこれは、空のマップ オブジェクトを渡す必要があった以前の方法よりも少し単純です。ただし、これは に固有のものですConcurrentHashMap

いずれにせよ、Java 設計者は、新しいマップ インターフェースが作成されるたびに新しいセット インターフェースを作成することもできましたが、サード パーティが独自のマップを作成する場合、そのパターンを強制することは不可能です。新しいセットを派生する静的メソッドを用意する方が適切です。このアプローチは、独自のマップ実装を作成する場合でも常に機能します。

おすすめ記事