Guava Multimap 教程

Guava Multimap 教程

本文我们看看Google Guava库中Map的实现————Multimap.其类似java.util.map,键值映射集合,但其每个键可以关联多个值。

maven 依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>

Multimap实现

使用Multimap,如果我们给相同的key增加两个值,第二个值不会覆盖第一个值,相反,会得到两个值,请看测试代码:

String key = "a-key";
Multimap<String, String> map = ArrayListMultimap.create();
 
map.put(key, "firstValue");
map.put(key, "secondValue");
 
assertEquals(2, map.size());

打印map的内容,输出为:

{a-key=[firstValue, secondValue]}

通过“a-key”键获取值,会得到Collection类型,其包括firstValue和secondValule:

Collection<String> values = map.get(key);

打印结果:

[firstValue, secondValue]

与标准Map比较

java.util包中map没有相同key可以关联多个值的功能。下面代码给map中同一个可以增加两个值:

String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();
 
map.put(key, "firstValue");
map.put(key, "secondValue");
 
assertEquals(1, map.size());

map中仅保留一个元素(secondValue),因为第二次put操作会覆盖第一个值。如果我们想实现Guava的Multimap相同功能,我们需要创建map,其中包含List类型作为其值:

String key = "a-key";
Map<String, List<String>> map = new LinkedHashMap<>();
 
List<String> values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }
 
map.put(key, values);
 
assertEquals(1, map.size());

很明显,使用很不方便。针对这样需求,guava Multimap想比标准map是更好的选择。
需要注意的是,虽然在list中有两个元素,但size方法返回1.在MultiMap中size返回实际存储在map中值的数量,但是keySet().size()返回唯一键的数量。

Multimap的优点

Multimap通常用在需要使用Map<K, Collection> 的场景,两者区别包括:

  • 通过put方法新增元素时,无需填充空集合

  • get方法从不返回null,仅为空结合(所以不像使用Map<String, Collection>,无需检查null)。

  • Multimap 中有一个key,如果其仅映射至一个值。任何导致其关联零个值的操作,将导致key关联的值在Multimap中被删除的效果。如果使用Map<String, Collection>,即使我们删除集合中所有值,其仍然会保留一个空结合作为其值,这个不必要的内存开销。

  • size方法返回所有值元素的数量

总结

本文我们展示了如何使用Guava MultiMap,并与标准Map进行比较显示Guava Multimap的优势。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值