22

我看到很多关于多地图的例子,但不明白为什么 Google Gauva 是不同的?

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

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

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

4

5 回答 5

31

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

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

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

于 2013-10-07T10:12:02.263 回答
17

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

使用核心 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),并且还提供了一些您原本需要的有用方法手动实现,例如获取所有Sets 中的所有值。

于 2013-10-07T10:11:22.830 回答
6

你误会了什么。这些甚至不大致等价:

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

在您的示例中,opt4将单个映射Integer到字符串集的集合。这正是使用 a 的重点Multimap,您不必显式处理第二维。所以事实上,正确的(等价的)声明应该是:

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

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

Map<Integer, Set<String>> mapView = multimap.asMap();
于 2013-10-08T07:39:16.883 回答
3

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

于 2013-10-07T10:11:20.940 回答
0

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

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

于 2013-10-07T10:21:53.870 回答