HashMap和HashMultimap有什么区别

Fai*_*sra 18 java collections guava

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

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

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 26

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

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

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

  • 这非常简单,因此很有帮助:) (2认同)

Ric*_*ich 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);
Run Code Online (Sandbox Code Playgroud)

与番石榴:

opt.put(key, value);
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*oyd 5

你误会了 这些甚至不是大致等效的:

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

在您的示例中,opt4将单个映射Integer到字符串集集合。正是使用a的意义Multimap,您不必显式处理第二维。因此,实际上,正确的(等效的)声明将是:

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava
Run Code Online (Sandbox Code Playgroud)

这样您就可以得到这样的地图视图:

Map<Integer, Set<String>> mapView = multimap.asMap();
Run Code Online (Sandbox Code Playgroud)