![](/img/trans.png)
[英]What is the difference between HashMap<Long, String> and HashMap<>?
[英]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.