我看到很多关于多地图的例子,但不明白为什么 Google Gauva 是不同的?
Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
以上两者对于保存数据的行为是相同的还是不同的?
我看到很多关于多地图的例子,但不明白为什么 Google Gauva 是不同的?
Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
以上两者对于保存数据的行为是相同的还是不同的?
A 将 AMultiMap<A, B>
类型的键与类型的值相关联Collection<B>
(因此命名为 MultiMap)
AMap<A, B>
将类型 A 的键与类型 B 的值相关联。
因此,aMultiMap<Integer, Set<String>>
可以被视为 a Map<Integer, Collection<Set<String>>
。通过阅读api 文档,这应该是显而易见的。
不同之处在于,对于第二种 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),并且还提供了一些您原本需要的有用方法手动实现,例如获取所有Set
s 中的所有值。
你误会了什么。这些甚至不大致等价:
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();
不,MultiMap
这意味着每个键都会附加一组对象。
文档:Multimap_Is_Not_A_Map
首先 com.google.common.collect.Multimap 不是 java.util.Map,它在一个单独的层次结构中。
其次,您可以使用Map<Integer, Set<String>>
Multimap 接口所需的所有操作,但您必须自己实现它们,而 HashMultimap 提供现成的实现。