Also, ich habe gerade die Javadoc für ArrayListMultimap
und LinkedListMultimap
gelesen, um zu verstehen, wie man sie verwendet und ich wusste, dass beide doppelte Schlüssel-Wert-Paar unterstützen (und damit meine ich gleiche Schlüssel, andere Werte - wenn ich verstehe richtig. Bitte korrigieren Sie mich, wenn ich falsch liege). Ich verstehe jedoch nicht den Unterschied zwischen ihnen. Beide werden zum Speichern von doppelten Schlüsselwertpaaren verwendet. Ist der einzige Teil, den sie unterscheiden, ihre Implementierung, d. H. ArrayListMultimap
ist als Array implementiert und LinkedListMultimap
ist als LinkedList implementiert? Wie unterscheiden sie sich in der Leistung? Ich weiß, ich frage viel, aber ich weiß nicht wirklich, wo ich sonst Antworten finden könnte.Wie unterscheidet sich ArrayListMultimap von LinkedListMultimap?
Antwort
Es ist in der Dokumentation ... und im Code. Abgesehen von einem Unterschied, den Sie bereits gesehen haben (List
Implementierungswahl), verwenden sie auch eine andere Map
Implementierung. So:
ArrayListMultimap
verwendetHashMap
für Karte undArrayList
cor Sammlung, die diese Iterationsreihenfolge solchen Verfahrens bedeutet wieentries()
,asMap().keySet()
asMap.entrySet()
oder undefiniert ist. Es ist schlicht und einfach Umsetzung vonListMultimap
und Sie sollten mit diesem beginnen.LinkedListMultimap
verwendetLinkedList
für die Sammlung und spezialisierte Datenstruktur (custom verketteten Liste) Iteration der Reihenfolge der oben genannten Verfahren zu erhalten:Sortieren einer verketteten Liste gehalten wird, unter Verwendung aller Schlüssel-Wert-Paaren enthält. Zusätzlich wird eine Reihe von getrennten Listen von "Geschwister", die jeweils die Werte für einen bestimmten Schlüssel enthalten, verwendet, um ValueForKeyIterator in konstanter Zeit zu implementieren.
Zusätzlich verwendet es nur wenige andere Strukturen „verketteten Liste“ -ähnlichen Regeln verhalten:
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
Auch Speicherbedarf ist eine Implikation der Träger in diesen Multimap
Implementierungen verwendet Sammlungen - see this comparision (möglicherweise nicht 100% aktuell).
Persönlich, wenn ich brauche effizient, wandelbar ListMultimap
mit definierten Iterationsreihenfolge von Schlüsseln, verwende ich "custom" ListMultimap
(erstellt mit MultimapBuilder
, die seit V16.0 in Guava ist):
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.linkedHashKeys().arrayListValues().build();
Bevor V16.0 das Erstellen von benutzerdefinierten Multimap
s war ausführlicher (mit 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();
}
});
}
Vielen Dank! Das hilft wirklich. – TheRookierLearner
erstaunliche Antwort! – ycomp
- 1. Warum unterscheidet sich {} + [] von ({} + [])?
- 2. Wie unterscheidet sich Hashtable
- 3. Wie unterscheidet sich Gitlab von Github?
- 4. Wie unterscheidet sich << von +?
- 5. GCC: Wie unterscheidet sich März von Mtune?
- 6. Wie unterscheidet sich MegaStore von BigTable?
- 7. Wie unterscheidet sich Gurke von JUnit?
- 8. Wie unterscheidet sich das Armspeichermodell von ia64?
- 9. Wie unterscheidet sich mpi_file_write von mpi_file_write_all?
- 10. Farbe von NavBar unterscheidet sich von Hintergrundfarbe
- 11. ProgressDialog Nachrichtentext unterscheidet sich von AlertDialog
- 12. Winforms ComboBox Höhe unterscheidet sich von ItemHeight
- 13. Wie unterscheidet sich das traditionelle Gerätetreiberprogramm?
- 14. Perl Mantisse unterscheidet sich von anderen Doppel
- 15. Identischer Code unterscheidet sich von verschiedenen Quellen
- 16. Warum git AuthorDate unterscheidet sich von CommitDate?
- 17. Tomcat JVM-Version unterscheidet sich von JAVA_HOME
- 18. Wie unterscheidet sich Dispatcher vom Hintergrund-Thread?
- 19. Wie unterscheidet sich die Dichte von ggplot2 von der Dichtefunktion?
- 20. unterscheidet sich von Foo.class.barMethod() und Foo.barMethod()
- 21. Subprozess pid unterscheidet sich von ps output
- 22. Warum unterscheidet sich std :: uint32_t von uint32_t?
- 23. MediaStore.Audio.Albums._ID unterscheidet sich von Song
- 24. php curl - Ergebnis unterscheidet sich von Browser
- 25. Sperrverhalten unterscheidet sich über Netzwerkfreigaben
- 26. Wie unterscheidet sich CurrentControlSet von ControlSet001 und ControlSet002?
- 27. Was ist NaNi und wie unterscheidet es sich von NaN?
- 28. Was macht Predef.locally, und wie unterscheidet es sich von Predef.identity
- 29. Wie sich Responsive Web Development von Progressive Web Development unterscheidet?
- 30. Wie unterscheidet sich ein Client von einem Server-Peer?
hat jemand ein gutes Beispiel dafür, wann eine 'LinkedListMultimap' sinnvoll ist (im Vergleich zu einer' ArrayListMultimap')? _by Beispiel Ich meine nicht Code - nur eine Situation_ – ycomp