我看到很多关于multimap的例子,但不明白为什么Google Guava会有所不同?
Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
以上两者在保存数据方面的行为是否相同或不同?
答案 0 :(得分:22)
A MultiMap<A, B>
将类型A的键与类型Collection<B>
的值相关联(因此名称为MultiMap)
A Map<A, B>
将类型A的键与类型B的值相关联。
因此,MultiMap<Integer, Set<String>>
可以被视为Map<Integer, Collection<Set<String>>
。通过阅读the api documentation,这应该是显而易见的。
答案 1 :(得分:15)
不同之处在于,对于第二个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
s的所有值。
答案 2 :(得分:4)
你误会了什么。这些甚至不大致相同:
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();
答案 3 :(得分:3)
不,MultiMap
意味着每个键都会附加一组对象。
Documentation: Multimap_Is_Not_A_Map
答案 4 :(得分:0)
首先,com.google.common.collect.Multimap不是java.util.Map,它位于单独的层次结构中。
其次,您可以使用Multimap接口需要Map<Integer, Set<String>>
的所有操作,但是您必须自己实现它们,而HashMultimap提供了现成的实现。