ArrayListMultimap与LinkedListMultimap有何不同?
所以,我只是读取了ArrayListMultimap
和LinkedListMultimap
的javadoc,以便了解如何使用它们,我发现它们都支持重复的键值对(并且我的意思是相同的键,不同的值 – 如果我理解正确的话。如果我错了,请纠正我)。 但是,我不明白它们之间的区别。 两者都用于存储重复的键值对。 它们不同的唯一部分是它们的实现,即ArrayListMultimap
是作为Array实现的,而LinkedListMultimap
是作为LinkedList实现的? 另外,它们在性能上有何不同? 我知道我问了很多,但我真的不知道在哪里可以找到答案。
它在文档……和代码中。 基本上除了您已经看到的一个差异( List
实现选择)之外,它们还使用不同的Map
实现。 所以:
-
ArrayListMultimap
使用HashMap
进行map和ArrayList
cor集合,这意味着诸如entries()
,asMap().keySet()
或asMap.entrySet()
之类的方法的迭代顺序是未定义的。 这是ListMultimap
简单实现,你应该从这个开始。 -
LinkedListMultimap
使用LinkedList
进行收集,并使用专门的数据结构(自定义链表)来维护上述方法的迭代顺序:使用包含所有键值对的链接列表维护订单。 此外,一系列不相交的“兄弟”链表,每个包含特定键的值,用于在恒定时间内实现ValueForKeyIterator 。
此外,它使用很少的其他结构来维护“链表”式行为:
private transient Node
head; // the head for all keys private transient Node tail; // the tail for all keys private transient Multiset keyCount; // the number of values for each key private transient Map > keyToKeyHead; // the head for a given key private transient Map > keyToKeyTail; // the tail for a given key
此外,内存占用是这些Multimap
实现中使用的后备集合的含义 – 请参阅此比较 (可能不是100%最新)。
就个人而言,当我需要具有定义的键迭代顺序的高效,可变的ListMultimap
时,我使用“自定义” ListMultimap
(使用MultimapBuilder
创建,自v16.0起在Guava中创建):
ListMultimap 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 ListMultimap newLinkedArrayListMultimap() { return Multimaps.newListMultimap( Maps.>newLinkedHashMap(), new Supplier>() { @Override public List get() { return Lists.newArrayList(); } }); }