2013-02-20 26 views
7

私はちょうどArrayListMultimapLinkedListMultimapのjavadocを読んでいたので、それらの使い方を理解しました。そして、私は両方のサポートが重複するキーと値のペアを知っていました。私が間違っている場合は私を修正してください)。しかし、私はそれらの違いを理解していません。両方とも、重複するキー値のペアを格納するために使用されます。それらが実装で異なるのは唯一の部分、つまりArrayListMultimapは配列として実装され、LinkedListMultimapはLinkedListとして実装されていますか?また、パフォーマンスがどのように異なるのでしょうか?私はたくさんの質問をしていることは分かっていますが、私は本当にこの答えがどこにあるのか分かりません。ArrayListMultimapとLinkedListMultimapの違いは?

+0

誰かが 'LinkedListMultimap'が便利な場合(' ArrayListMultimap'と比べて)の良い例はありますか? _私がコードを意味するわけではありません - ただの状況_ – ycomp

答えて

21

これはドキュメント内にあり、コード内にあります。基本的には、既に見た違い(List実装の選択)のほかに、異なるMapの実装も使用します。だから、:

  • ArrayListMultimapはマップとentries()asMap().keySet()またはasMap.entrySet()などの方法の反復順序が定義されていないことを意味ArrayList CORコレクション、ためHashMapを使用しています。それは平凡で簡単なListMultimapの実装であり、これで始めるべきです。

    注文はすべてのキーと値 ペアを含むリンクリストを使用して維持されている:

  • LinkedListMultimapは、上記の方法の反復秩序を維持するために収集し、専門的なデータ構造のためのLinkedList(カスタムリンクリスト)を使用しています。さらに、 の「兄弟」の一連の独立したリンクリストは、それぞれ特定のキーの値を含んでおり、 を使用して、ValueForKeyIteratorを一定の時間内に実装します。

    さらにそれが行動様「リンクリスト」を維持するために、いくつかの他の構造を使用しています。

    private transient Node<K, V> head; // the head for all keys 
    private transient Node<K, V> tail; // the tail for all keys 
    private transient Multiset<K> keyCount; // the number of values for each key 
    private transient Map<K, Node<K, V>> keyToKeyHead; // the head for a given key 
    private transient Map<K, Node<K, V>> keyToKeyTail; // the tail for a given key 
    

また、メモリフットプリントは、これらのMultimapの実装に使用されるバッキングコレクションの意味である - see this comparision(最新の100%ではない可能性があります)。

個人的に

、私はキーの定義された繰り返し順序を持つListMultimap、効率的な可変を必要とするとき、私は(v16.0以降グアバであるMultimapBuilderで作成した、)「カスタム」ListMultimapを使用します。

ListMultimap<String, Integer> treeListMultimap = 
    MultimapBuilder.linkedHashKeys().arrayListValues().build(); 
v16.0は、カスタム Multimap Sを作成する前

は(Multimaps.newListMultimapを使用して)より冗長だった:

/** 
* Creates {@link ListMultimap} preserving insertion order of keys and values 
* (it's backed by {@link LinkedHashMap} and {@link ArrayList}). 
*/ 
public static <K, V> ListMultimap<K, V> newLinkedArrayListMultimap() { 
    return Multimaps.newListMultimap(
     Maps.<K, Collection<V>>newLinkedHashMap(), 
     new Supplier<List<V>>() { 
      @Override 
      public List<V> get() { 
      return Lists.newArrayList(); 
      } 
     }); 
} 
+0

ありがとう!それは本当に役立ちます。 – TheRookierLearner

+0

すばらしい答え! – ycomp

関連する問題