2013-02-20 20 views
7

O yüzden, sadece bunların nasıl kullanılacağını anlamak için ArrayListMultimap ve LinkedListMultimap böylece için javadoc okuyordu ve ben hem yinelenen anahtar-değer çifti destekleyen (ve bu tarafından ben aynı anahtarları, farklı değerler anlamına geldiğini bilmek geldi - Anlıyorum eğer doğru, yanlış olduğumda lütfen beni düzeltin. Ancak, aralarındaki farkı anlamıyorum. Her ikisi de çift anahtar değer çiftlerini saklamak için kullanılır. Farklı oldukları tek parça, uygulamalarında yani ArrayListMultimap, bir Dizi ve LinkedListMultimap bir LinkedList olarak uygulanmış mı? Ayrıca, performansta nasıl farklılıklar gösterirler? Biliyorum çok şey soruyorum ama bunun için başka nerede cevap bulacağımı bilmiyorum.ArrayListMultimap, LinkedListMultimap'ten nasıl farklıdır?

+0

kimse bir 'LinkedListMultimap' (sadece bir 'ArrayListMultimap' karşılaştırıldığında) kullanışlı olduğunda iyi bir örnek var mı? _by örnek Kod demek istemiyorum - sadece bir durum_ – ycomp

cevap

21

O ... docs ve kod içinde. Temel olarak zaten gördüğünüz bir farkın yanı sıra (List uygulama seçimi), farklı bir Map uygulaması da kullanıyorlar. Yani:

  • ArrayListMultimap Harita için HashMap ve ArrayListentries(), asMap().keySet() veya asMap.entrySet() tanımsız gibi yöntemlerin bu yineleme sırasını ifade eder cor toplama kullanır. ListMultimap'un sade ve basit bir uygulamasıdır ve bununla başlamalıdır.

    al tüm anahtar değerini çiftlerini içeren bir bağlantılı liste kullanılarak korunur:

  • LinkedListMultimap yukarıda sözü edilen yöntemlerin yineleme sırasını korumak için toplama ve özel bir veri yapısı (özel bağlantılı liste) için LinkedList kullanır. Buna ek olarak, "kardeş", belirli bir anahtar değerlerini ihtiva eden her bir ayrık bağlantılı hale getirilmiş listeler, bir dizi sabit zamanda ValueForKeyIterator uygulamak için kullanılır.

    Buna ek olarak "bağlantılı liste" korumak için birkaç diğer yapıları kullanan benzeri davranışı:

    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 
    
    Ayrıca

, bellek ayak izi bu Multimap uygulamalarında kullanılan sırt koleksiyonlarından bir uzantısıdır - see this comparision (bugüne kadar% 100 olmayabilir).

ListMultimap<String, Integer> treeListMultimap = 
    MultimapBuilder.linkedHashKeys().arrayListValues().build(); 
: Şahsen


, ben verimli gerektiğinde, anahtarların tanımlanmış yineleme emriyle ListMultimap değişken, ben (v16.0 beri Guava içindedir MultimapBuilder ile oluşturulan,) ListMultimap "Özel" kullanın v16.0 özel Multimap s oluşturmadan önce


(Multimaps.newListMultimap kullanarak) daha ayrıntılı olarak:

/** 
* 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

Çok teşekkürler! Bu gerçekten yardımcı olur. – TheRookierLearner

+0

Harika cevap! – ycomp

İlgili konular