Guava使用之BiMap

通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是一些应用场景中需要我们通过value获取key。这个时候如果用传统的方法就需要维护两个map,并且需要保持他们之间的同步。

对于值已经存在的情况,会变得非常混乱。例如:

Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();
&nbsp;
nameToId.put("Bob", 42);
idToName.put(42, "Bob");
//如果"Bob"和42已经在map中了,会发生什么?
//如果我们忘了同步两个map,会有诡异的bug发生...

这里面有两个问题:
1. 如何处理重复的value的情况。不考虑的话,反转的时候就会出现覆盖的情况.
2. 如果在反转的map中增加一个新的key,倒转前的map是否需要更新一个值呢?

这个时候使用BiMap就会非常简单解决,BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。

BiMap<K, V>是特殊的Map:
- 可以用 inverse()反转BiMap<K, V>的键值映射
- 保证值是唯一的,因此 values()返回Set而不是普通的Collection

在使用BiMap时,会要求Value的唯一性。如果value重复了则会抛出错误:java.lang.IllegalArgumentException
如果我们确实需要插入重复的value值,那可以选择forcePut方法。但是我们需要注意的是前面的key也会被覆盖了。

理解inverse方法

inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。例如:

@Test
public void testBiMap(){
    BiMap<Integer,String> logfileMap = HashBiMap.create();
    logfileMap.put(1,"a.log");
    logfileMap.put(2,"b.log");
    logfileMap.put(3,"c.log");
    System.out.println("logfileMap:"+logfileMap);
    BiMap<String,Integer> filelogMap = logfileMap.inverse();
    System.out.println("filelogMap:"+filelogMap);

    logfileMap.put(4,"d.log");

    System.out.println("logfileMap:"+logfileMap);
    System.out.println("filelogMap:"+filelogMap);
}

输出的结果是:

logfileMap:{1=a.log, 2=b.log, 3=c.log}
filelogMap:{a.log=1, b.log=2, c.log=3}
logfileMap:{1=a.log, 2=b.log, 3=c.log, 4=d.log}
filelogMap:{a.log=1, b.log=2, c.log=3, d.log=4}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值