HashMap和HashMultimap有什么区别

时间:2013-10-07 10:08:16

标签: java collections guava

我看到很多关于multimap的例子,但不明白为什么Google Guava会有所不同?

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

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

以上两者在保存数据方面的行为是否相同或不同?

5 个答案:

答案 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提供了现成的实现。