Итак, я просто читал javadoc для ArrayListMultimap
и LinkedListMultimap
, чтобы понять, как их использовать, и я узнал, что обе поддерживают двойную пару ключ-значение (и тем самым я имею в виду те же ключи, разные значения - если я понимаю правильно. Пожалуйста, поправьте меня, если я ошибаюсь). Однако я не понимаю разницы между ними. Оба используются для хранения повторяющихся пар значений ключа. Единственная их отличия заключается в их реализации. ArrayListMultimap
реализован как массив и LinkedListMultimap
реализован как LinkedList? Кроме того, как они отличаются по производительности? Я знаю, что много спрашиваю, но я не знаю, где еще найти ответы на это.Как ArrayListMultimap отличается от LinkedListMultimap?
ответ
Это в документах ... и в коде. В основном помимо одной разницы, которую вы уже видели (List
выбор реализации), они также используют другую реализацию Map
. Итак:
ArrayListMultimap
используетHashMap
для отображения и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
реализаций - see this comparision (не может быть на 100% до настоящего времени).
Лично я, когда нужно эффективно, изменяемые ListMultimap
с определенной итерации порядка ключей, я использую "обычай" ListMultimap
(созданный с MultimapBuilder
, который находится в гуавы, так как v16.0):
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();
}
});
}
Спасибо большое! Это действительно помогает. – TheRookierLearner
замечательный ответ! – ycomp
- 1. LinkedListMultimap или последовательность MultiMap
- 2. Googles ArrayListMultimap
- 3. Извлечь ключ ArrayListMultimap
- 4. PowerMock StackOveflowError на ArrayListMultimap
- 5. Как `((...))` отличается от `(...)`?
- 6. Как отличается от +?
- 7. Как $() отличается от перенаправления?
- 8. Получение Guava ArrayListMultimap для работы
- 9. Импорт ArrayListMultimap в IntelliJ - Java
- 10. метод создания недоступен в ArrayListMultimap
- 11. Как профилирование отличается от регистрации?
- 12. Как listview отличается от listactivity
- 13. Как отличается android.database от android.database.sqlite?
- 14. Как __proto__ отличается от конструктора.прототипом?
- 15. Как отличается engine.io от socket.io?
- 16. Как WebDAV отличается от HTTP?
- 17. Как input_iterator_tag отличается от forward_iterator_tag?
- 18. Как redisAsyncConnect() отличается от redisConnect()?
- 19. Как Node.js отличается от tomcat
- 20. Как огурец отличается от JUnit?
- 21. Как сборка отличается от сборки?
- 22. Как mpi_file_write отличается от mpi_file_write_all?
- 23. Как BroadcastReceiver отличается от намерения
- 24. Как Gitlab отличается от Github?
- 25. Как Logstash отличается от Kafka
- 26. Как ракета отличается от схемы?
- 27. Как металл отличается от стойки?
- 28. Как PostgreSQL отличается от MySQL?
- 29. как двойной отличается от Double?
- 30. Как mysql отличается от оракула?
У кого-нибудь есть хороший пример того, когда «LinkedListMultimap» полезен (по сравнению с «ArrayListMultimap»)? _by Например, я не имею в виду код - просто ситуация_ – ycomp