所以,我只是读的Javadoc ArrayListMultimap
和LinkedListMultimap
,以便了解如何使用他们,我才知道,都支持重复的键值对(和我的意思是相同的键,不同的价值观 - 如果我没有理解如果我错了,请纠正我)。但是,我不明白他们之间的区别。两者都用于存储重复的键值对。是它们之间的区别只有一部分是在执行过程中即ArrayListMultimap
被实现为数组和LinkedListMultimap
实现为一个LinkedList?另外,它们在性能上有何不同?我知道我问了很多,但我不知道还有哪些地方可以找到答案。ArrayListMultimap与LinkedListMultimap有什么不同?
回答
它在文档...并在代码。基本上除了你已经看到了一个差异(List
实现选择),他们也使用不同的Map
实现。所以:
ArrayListMultimap
使用HashMap
在地图和ArrayList
COR收集,这意味着这些方法的该迭代顺序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 2013-02-20 09:46:39
惊人的答案! – ycomp 2017-10-31 02:38:40
- 1. Data.Void.absurd与⊥有什么不同?
- 2. “((...))”与“(...)”有什么不同?
- 3. 与ramda.js代码有什么不同?
- 4. Python - 信号与pubsub有什么不同?
- 5. 与%.1f和%.01f有什么不同?
- 6. subprocess.call与os.system有什么不同
- 7. SystemVerilog 0与'0'有什么不同?
- 8. listview与listactivity有什么不同
- 9. Erlang与OOP对象有什么不同?
- 10. wait_for_completion与wakeup_interruptible有什么不同
- 11. 网页与aspnet表有什么不同?
- 12. libspe与libspe2?有什么不同?
- 13. CurrentControlSet与ControlSet001和ControlSet002有什么不同?
- 14. AWS与Lightsail有什么不同?
- 15. Boilerplate.js与Backbone.js有什么不同?
- 16. MegaStore与BigTable有什么不同?
- 17. 闭包与回调有什么不同?
- 18. mpi_file_write与mpi_file_write_all有什么不同?
- 19. 对象与文件有什么不同?
- 20. 与$(document).ready()有什么不同?
- 21. engine.io与socket.io有什么不同?
- 22. This.value与值,有什么不同?
- 23. os.system与命令行有什么不同?
- 24. EmailProperty与StringProperty有什么不同?
- 25. 'const struct'与'struct'有什么不同?
- 26. HasManyThrough与MappedManyToMany有什么不同?
- 27. Cloudant与CouchDB有什么不同?
- 28. 与Angular代码有什么不同
- 29. nodejs与运行libevent有什么不同?
- 30. AudioSession与Audio Queue Services有什么不同?
人有当'LinkedListMultimap'(相比,只是一个'ArrayListMultimap')是有用的一个很好的例子? _例如,我不是指代码 - 只是一种情况_ – ycomp 2017-10-31 02:39:57