1. ホーム
  2. java

[解決済み] ConcurrentHashMapに対するConcurrentHashSetが存在しない理由

2022-03-15 04:09:12

質問

HashSetはHashMapをベースにしています。

を見ると HashSet<E> の実装では、すべてが HashMap<E,Object> .

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

そして、私たちは次のことを知っています。 HashMap はスレッドセーフではありません。そのため ConcurrentHashMap をJavaで作成しました。

これを踏まえて、私は以下のように混乱しています。 に基づいているはずのConcurrentHashSetがないのはなぜでしょうか? ConcurrentHashMap ?

他に何か足りないものはありますか?私は Set をマルチスレッド環境で使用することができます。

また、もし私が独自の ConcurrentHashSet を置き換えるだけで、実現できるのでしょうか? HashMap から ConcurrentHashMap で、残りはそのまま?

どのように解決するのですか?

には組み込みの型がありません。 ConcurrentHashSet なぜなら、常に 導出 をマップから取得します。マップには多くの種類があるので、与えられたマップ(またはマップクラス)からセットを生成するためのメソッドを使用します。

Java 8 より前のバージョンでは、同時実行ハッシュ・マップにバックされた同時実行ハッシュ・セットを生成するために Collections.newSetFromMap(map)

Java 8 では (@Matt の指摘により) 並列ハッシュセットを取得することができます。 ビュー を経由して ConcurrentHashMap.newKeySet() . これは、以前の newSetFromMap これは、空のマップオブジェクトを渡す必要がありました。しかし、これは ConcurrentHashMap .

いずれにせよ、Javaの設計者は、新しいマップ・インターフェースが作られるたびに新しいセット・インターフェースを作ることもできましたが、そのパターンでは、サードパーティが独自のマップを作ったときに、強制力を持たせることができません。それよりも、新しいセットを派生させる静的メソッドを用意したほうがいい。そのやり方なら、自分でマップの実装を作ったときでも、常にうまくいく。