繁体   English   中英

HashMap和HashMultimap有什么区别

[英]What is difference between HashMap and HashMultimap

我看到很多关于multimap的例子,但不明白Google Gauva为何与众不同?

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

以上两者对于保存数据的行为是否相同或不同?

MultiMap<A, B>将类型A的键与Collection<B>类型的值相关联(因此名称为MultiMap)

Map<A, B>将类型A的键与类型B的值相关联。

因此, MultiMap<Integer, Set<String>>可以被视为Map<Integer, Collection<Set<String>> 通过阅读api文档,这一点应该是显而易见的。

不同之处在于,对于第二个Core Java实现,您需要在插入之前检查Set是否存在。 Guava的Multimap为您解决了这个问题。

使用Core Java:

Set<String> innerSet = opt.get(key);
if (innerSet == null) {
    innerSet = new HashSet<String>();
    opt.put(key, innerSet);
}
innerSet.add(value);

与番石榴:

opt.put(key, value);

Guava负责初始化一个否则不存在的Set来存储值,处理任何线程问题(例如,阻止两个线程并行创建一个新的Set用于同一个键)并且还提供了一些你需要的有用方法手动实现,例如获取所有Set的所有值。

你误会了什么。 这些甚至不大致相同:

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

在您的示例中, opt4会将单个Integer映射到一组字符串集合。 这正是使用Multimap ,您不必明确处理第二维。 所以事实上,正确的(等效的)声明是:

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava

你可以得到这样的地图视图:

Map<Integer, Set<String>> mapView = multimap.asMap();

不, MultiMap意味着每个键都会附加一组对象。 文档:Multimap_Is_Not_A_Map

首先,com.google.common.collect.Multimap不是java.util.Map,它位于单独的层次结构中。

其次,您可以使用Multimap接口所需的Map<Integer, Set<String>>进行所有操作,但您必须自己实现它们,而HashMultimap提供了现成的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM