web-dev-qa-db-ja.com

HashMapとHashMultimapの違いは何ですか

マルチマップの例をたくさん見ましたが、Googleグアバがなぜ違うのか理解できませんでしたか?

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

上記の両方はデータを保持するために同じように動作しますか、それとも異なりますか?

18
Faisal Basra

MultiMap<A, B>は、タイプAのキーをタイプCollection<B>の値に関連付けます(そのため、MultiMapという名前です)。

Map<A, B>は、タイプAのキーをタイプBの値に関連付けます。

したがって、MultiMap<Integer, Set<String>>Map<Integer, Collection<Set<String>>として表示できます。これは apiドキュメント を読むことで明白になります。

26
JB Nizet

違いは、2番目のコアJava実装では、挿入する前にセットがそこにあるかどうかを確認する必要があるということです。Guavaのマルチマップがそれを処理します。

Core Javaの場合:

Set<String> innerSet = opt.get(key);
if (innerSet == null) {
    innerSet = new HashSet<String>();
    opt.put(key, innerSet);
}
innerSet.add(value);

グアバで:

opt.put(key, value);

Guavaは、値を格納するために存在しないSetの初期化を処理し、スレッド化の問題(たとえば、2つのスレッドが同じキーに対して新しいSetを並行して作成するのを停止する)を処理し、他に必要ないくつかの便利なメソッドを提供しますすべてのSetsのすべての値を取得するなど、手動で実装する。

15
Rich

あなたは何かを誤解しました。これらは大体同等ではありません:

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

あなたの例では、opt4は、単一のIntegerを文字列のセットのコレクションにマップします。それがまさにMultimapを使用するポイントです。2番目の次元を明示的に扱う必要はありません。したがって、実際には、正しい(同等の)宣言は次のようになります。

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava

次のようなマップビューを取得できます。

Map<Integer, Set<String>> mapView = multimap.asMap();
5

いいえ、MultiMapは、各キーにアタッチされたオブジェクトのコレクションがあることを意味します。 ドキュメント:Multimap_Is_Not_A_Map

3
Admit

まず、com.google.common.collect.MultimapはJava.util.Mapではなく、別の階層にあります。

次に、Multimapインターフェースに必要なMap<Integer, Set<String>>を使用してすべての操作を実行できますが、HashMultimapがすぐに実装できるようにしながら、自分で実装する必要があります。

0