マルチマップの例をたくさん見ましたが、Googleグアバがなぜ違うのか理解できませんでしたか?
Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
上記の両方はデータを保持するために同じように動作しますか、それとも異なりますか?
MultiMap<A, B>
は、タイプAのキーをタイプCollection<B>
の値に関連付けます(そのため、MultiMapという名前です)。
Map<A, B>
は、タイプAのキーをタイプBの値に関連付けます。
したがって、MultiMap<Integer, Set<String>>
はMap<Integer, Collection<Set<String>>
として表示できます。これは apiドキュメント を読むことで明白になります。
違いは、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を並行して作成するのを停止する)を処理し、他に必要ないくつかの便利なメソッドを提供しますすべてのSet
sのすべての値を取得するなど、手動で実装する。
あなたは何かを誤解しました。これらは大体同等ではありません:
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();
いいえ、MultiMap
は、各キーにアタッチされたオブジェクトのコレクションがあることを意味します。 ドキュメント:Multimap_Is_Not_A_Map
まず、com.google.common.collect.MultimapはJava.util.Mapではなく、別の階層にあります。
次に、Multimapインターフェースに必要なMap<Integer, Set<String>>
を使用してすべての操作を実行できますが、HashMultimapがすぐに実装できるようにしながら、自分で実装する必要があります。