这个真让我(和我的同事)烦恼。
不是
那么为什么没有人注意到这个命名惯例的缺陷或者这个错字背后是否有意图?
答案 0 :(得分:6)
这不是一个错字。番石榴的Multimap
不一个Map
,即它不会扩展Map
接口(它不应该)。见Guava's wiki page on this topic:
Multimap.get(key)
始终返回非null,可能为空的集合。这并不意味着multimap会花费与该键相关联的任何内存,而是返回的集合是一个视图,允许您根据需要添加与该键的关联。- 如果您希望更多
当且仅当存在与指定键关联的任何元素时,Map
类似于返回null
的行为,而不是多地图中的键,请使用asMap()
视图获取Map<K, Collection<V>>
。 (或者,要从Map<K,
获取List
<V>>
ListMultimap
,请使用the staticMultimaps.asMap()
method。{{1}存在类似方法}和SetMultimap
。)SortedSetMultimap
才为真。特别是,如果某个键Multimap.containsKey(key)
之前已与一个或多个已从多图中删除的值相关联,则k
将返回false。Multimap.containsKey(k)
返回Multimap.entries()
中所有密钥的所有条目。如果您想要所有密钥收集条目,请使用Multimap
。asMap().entrySet()
返回整个multimap中的条目数,而不是不同键的数量。请改用Multimap.size()
来获取不同键的数量。
另一方面,Apache Commons Collections' MultiMap
(不是地图中的大写“M”)扩展Multimap.keySet().size()
,但使用起来有点尴尬,加上Apache开发人员也来到了扩展和模仿地图的地方多图中的类似行为不是用户想要的,所以他们弃用Map
(是的,你不应该使用旧的MultiMap
接口及其在新代码中的实现!)现在建议使用MultiValueMap
代替它 - 不扩展MultiMap
,并且与Guava等效的API非常相似。
答案 1 :(得分:4)
&#34; multimap&#34; (一个字,全部小写)指的是一个特定的数据结构。它与&#34; map&#34;不同,后者是另一种数据结构。因此,由于它们具有不同的数据结构,因此它们具有不同的名称。
您通常在Java中使用的Map
界面是associative array的所选名称,也称为&#34;地图&#34;,&#34;字典&#34;,&# 34; hash&#34;等。同样,Guava的Multimap
接口是multimap
数据结构的表示。