java 変換 - HashMapとHashMultimapの違いは何ですか




多次元 格納 (5)

マルチマップの例がたくさんありますが、Google Gauvaが違う理由がわかりませんでした。

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

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

上記の両方は、データを保持するために同じように振る舞いますか、それとも違いますか?


Answers

違いは、2番目のCore Java実装では、挿入する前にSetがあるかどうかを確認する必要があるということです。 GuavaのMultimapはあなたのためにそれを世話します。

コア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またがってすべての値を取得するなど、手作業で実装します。


まず第一にcom.google.common.collect.Multimapはjava.util.Mapではありません、それは別の階層にあります。

次に、Multimapインタフェースが必要とするMap<Integer, Set<String>>を使用したすべての操作を実行できますが、HashMultimapが実装を準備している間は、それらを自分で実装する必要があります。


A MultiMap<A, B>は、A型のキーをCollection<B>型の値に関連付けます(したがって、MultiMapという名前になります)。

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

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


あなたは何かを誤解しました。 これらはおおよそ同等ではありません。

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

あなたの例では、 opt4は単一のIntegeropt4にマッピングするでしょう。 それがまさにMultimapを使うことのポイントです、あなたは明示的に二次元を扱う必要はありません。 したがって、実際には、正しい(同等の)宣言は次のようになります。

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

そしてこのようなマップビューを得ることができます:

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

StringBuffer同期追加メソッドとStringBuffer非同期追加メソッドの内部をチェックします。

StringBuffer

public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

public synchronized StringBuffer append(Object obj) {
    super.append(String.valueOf(obj));
    return this;
}

public synchronized StringBuffer append(String str) {
    super.append(str);
    return this;
}

StringBuilder

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
}

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

appendがsynchronizedので、 StringBufferは、マルチスレッドのシナリオでStrinbBuilderと比較してパフォーマンスのオーバーヘッドをStrinbBuilderます。 複数のスレッド間でバッファを共有していない限り、 StringBuilder使用します。これは、追加メソッドでsynchronizedがないため高速です。





java collections guava