だから、私はちょうどそれらの使い方を理解するためにArrayListMultimap
とのjavadocを読んでいて、両方が重複したキーと値のペアをサポートしていることを知りました(つまり、同じキー、異なる値を意味します-私が正しく理解していれば。修正してくださいLinkedListMultimap
私が間違っていれば私)。しかし、私はそれらの違いを理解していません。両方とも、重複するキーと値のペアを格納するために使用されます。それらが異なる唯一の部分は実装です。つまりArrayListMultimap
、配列としてLinkedListMultimap
実装され、LinkedList として実装されていますか? また、性能はどのように異なりますか?私は多くのことを尋ねていることを知っていますが、これに対する答えを他にどこで見つけることができるか本当にわかりません。
1 に答える
それはドキュメントにあります...そしてコードにあります。基本的に、すでに見た1つの違い(List
実装の選択)に加えて、それらは異なるMap
実装も使用します。それで:
ArrayListMultimap
HashMap
mapおよびcorコレクションに使用します。これは、、またはArrayList
などのメソッドの反復順序が未定義であることを意味します。これはの単純で単純な実装であり、これから始める必要があります。entries()
asMap().keySet()
asMap.entrySet()
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
また、メモリフットプリントは、これらの実装で使用されるバッキングコレクションの影響です。この比較を参照してください(100%最新ではない場合があります)。
個人的にはListMultimap
、キーの反復順序を定義して効率的で変更可能にする必要がある場合は、「カスタム」ListMultimap
(MultimapBuilder
v16.0以降Guavaにある、で作成)を使用します。
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.linkedHashKeys().arrayListValues().build();
v16.0より前は、カスタムMultimap
の作成はより冗長でした(を使用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();
}
});
}