2013-02-20 87 views
7

所以,我只是读的Javadoc ArrayListMultimapLinkedListMultimap,以便了解如何使用他们,我才知道,都支持重复的键值对(和我的意思是相同的键,不同的价值观 - 如果我没有理解如果我错了,请纠正我)。但是,我不明白他们之间的区别。两者都用于存储重复的键值对。是它们之间的区别只有一部分是在执行过程中即ArrayListMultimap被实现为数组和LinkedListMultimap实现为一个LinkedList?另外,它们在性能上有何不同?我知道我问了很多,但我不知道还有哪些地方可以找到答案。ArrayListMultimap与LinkedListMultimap有什么不同?

+0

人有当'LinkedListMultimap'(相比,只是一个'ArrayListMultimap')是有用的一个很好的例子? _例如,我不是指代码 - 只是一种情况_ – ycomp 2017-10-31 02:39:57

回答

21

它在文档...并在代码。基本上除了你已经看到了一个差异(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(); 
      } 
     }); 
} 
+0

非常感谢!这真的有帮助。 – TheRookierLearner 2013-02-20 09:46:39

+0

惊人的答案! – ycomp 2017-10-31 02:38:40