ArrayListMultimap与LinkedListMultimap有何不同?

时间:2013-02-20 08:54:42

标签: java guava

所以,我只是在阅读ArrayListMultimapLinkedListMultimap的javadoc,以便了解如何使用它们,我发现它们都支持重复的键值对(我的意思是相同的键,不同的值 - 如果我理解正确。如果我错了请纠正我)。但是,我不明白它们之间的区别。两者都用于存储重复的键值对。它们不同的唯一部分是它们的实现,即ArrayListMultimap是作为数组实现的,而LinkedListMultimap是作为LinkedList实现的?另外,它们在性能上有何不同?我知道我问了很多,但我真的不知道在哪里可以找到答案。

1 个答案:

答案 0 :(得分:24)

它在文档......和代码中。基本上除了您已经看到的一个差异(List实现选择)之外,它们还使用不同的Map实现。所以:

  • ArrayListMultimap使用HashMap进行地图和ArrayList cor集合,这意味着entries()asMap().keySet()或{{1}等方法的迭代顺序是未定义的。这是asMap.entrySet()的简单实现,你应该从这个开始。
  • ListMultimap使用LinkedListMultimap进行收集和专门的数据结构(自定义链接列表)来维护上述方法的迭代顺序:

      

    使用包含所有键值的链接列表维护订单   对。另外,还有一系列不相交的链表   使用“兄弟姐妹”,每个“兄弟姐妹”包含特定键的值   在恒定时间内实现 ValueForKeyIterator

    此外,它使用很少的其他结构来维护“链表”式行为:

    LinkedList

此外,内存占用量是这些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 实现中使用的支持集合的含义 - see this comparision(可能不是100%最新的)。


就个人而言,当我需要具有定义的密钥迭代顺序的高效,可变Multimap时,我使用“自定义”ListMultimap(使用MultimapBuilder创建,自v16.0起在Guava中创建):

ListMultimap

在v16.0之前创建自定义ListMultimap<String, Integer> treeListMultimap = MultimapBuilder.linkedHashKeys().arrayListValues().build(); 更加详细(使用Multimaps.newListMultimap):

Multimap