[Guava源码日报](11)BiMap

标签: Guava 源码
388人阅读 评论(0) 收藏 举报
分类:

BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果我们想根据value值查找key时,我们就需要额外编写一些代码来实现这个功能。BiMap为我们实现了这个功能。

@Test
    public void test1(){
        BiMap<String,String> weekNameMap = HashBiMap.create();
        weekNameMap.put("星期一","Monday");
        weekNameMap.put("星期二","Tuesday");
        weekNameMap.put("星期三","Wednesday");
        weekNameMap.put("星期四","Thursday");
        weekNameMap.put("星期五","Friday");
        weekNameMap.put("星期六","Saturday");
        weekNameMap.put("星期日","Sunday");
        System.out.println("星期日的英文名是" + weekNameMap.get("星期日"));
        System.out.println("Sunday的中文是" + weekNameMap.inverse().get("Sunday"));
    }

BiMap是一个接口,是Map的子类。

public interface BiMap<K, V> extends Map<K, V> {

1. put

如果给定的值value,已经被绑定到相同BiMap中的不同key上,会抛出IllegalArgumentException。如果你不想抛出这个异常,可以使用forePut方法来代替,来强制插入。

@Override
  V put(@Nullable K key, @Nullable V value);

实例(HashBiMap实现):

@Test
    public void test2(){
        BiMap<String,String> weekNameMap = HashBiMap.create();
        weekNameMap.put("星期一","Monday");
        weekNameMap.put("星期一","Tuesday");
        System.out.println(weekNameMap.get("星期一"));
        // java.lang.IllegalArgumentException: value already present: Tuesday
        weekNameMap.put("星期二","Tuesday");
    }

2. forcePut

forcePut,是put方法的一种变形。该方法会悄悄删除已经存在key的对应的键值对entry。如果插入的键值对已经存在,该方法没有任何作用。

V forcePut(@Nullable K key, @Nullable V value);

当调用该方法之前插入过该key,方法返回值为key对应的原value,否则返回null。

实例:

@Test
    public void test4() {
        BiMap<String, String> weekNameMap = HashBiMap.create();
        // null
        System.out.println(weekNameMap.put("星期一", "Monday"));
        // 如果之前插入过该key forcePut 返回 key对应的原value   Mondy
        System.out.println(weekNameMap.forcePut("星期一", "new-Monday"));
        // 如果之前没有插入过该key forcePut 返回 null
        System.out.println(weekNameMap.forcePut("星期二", "Tuesday"));
        // Tuesday
        System.out.println(weekNameMap.forcePut("星期二", "new-Tuesday"));
        // {星期二=new-Tuesday, 星期一=new-Monday}
        System.out.println(weekNameMap.toString());
    }

3. putAll

添加map中的键值对,该方法的返回值取决于map的迭代顺序。

void putAll(Map<? extends K, ? extends V> map);

实现类中会调用put方法,把map中的entry添加进来,如果put失败,会抛出IllegalArgumentException。注意的是,在抛出异常之前,map中多个entry可能已经添加到bimap中了。(还不是很理解)

4. values

因为BiMap不具有重复值,所以这个方法返回Set,而不是Collection

Set<V> values();

5. inverse

该方法返回一个反转后的BiMap,即key/value互换的映射。 这个方法并不是返回一个新的BiMap,而是返回BiMap的一个视图。所以在这个反转后的BiMap中的任何操作都会影响原来的BiMap。因为反转后key/value互换,我们可以根据value值来查询对应的key值。

BiMap<V, K> inverse();

实例:

@Test
    public void test5() {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("Q01", "内马尔");
        biMap.put("Q02","法布雷加斯");
        biMap.put("Q03","罗伊斯");
        // {Q03=罗伊斯, Q02=法布雷加斯, Q01=内马尔}
        System.out.println(biMap.toString());
        // 反转后BiMap
        BiMap inverseBiMap = biMap.inverse();
        // 根据value查找key  Q03
        System.out.println(inverseBiMap.get("罗伊斯"));
        // {罗伊斯=Q03, 法布雷加斯=Q02, 内马尔=Q01}
        System.out.println(inverseBiMap.toString());
    }
查看评论

Guava学习之BiMap

在前面的《Guava学习之Multimap》文章中我们谈到了Guava类库中的Multimap,其特点是存在在Multimap中的键值对可以不唯一;而我们又知道,在Java集合类库中有个Map,它的特...
  • w397090770
  • w397090770
  • 2013-07-10 16:15:21
  • 3918

Guava-BiMap

Guava-BiMap 1.参考 Interface BiMap 2.实现类 EnumBiMap, EnumHashBiMap, HashBiMap, ImmutableBiMap 详见...
  • hjw199089
  • hjw199089
  • 2018-01-15 23:04:46
  • 123

Guava类库学习--Multiset+Multimap+BiMap

三个Demo实例了解Multiset,Multimap,BiMap,它们都是接口,所以在创建对象时不能使用new关键字 Multiset set=HashMultiset.create(); Mult...
  • Bazingaea
  • Bazingaea
  • 2016-04-24 12:54:11
  • 563

Guava学习笔记【9】:Guava新增集合类型-Bimap

BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。   通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,...
  • azhegps
  • azhegps
  • 2017-05-08 23:58:06
  • 106

[Guava]——BiMap

public class demo7 {//hashmap,键唯一,值可以重复,BiMap:双向Map(Bidrectional Map)键与值都不能重 public static void mai...
  • MyFuture_MyDream
  • MyFuture_MyDream
  • 2016-04-03 18:21:28
  • 195

HashBiMap源码解析

HashBiMap源码: 首先看看HashBiMap到底是一个什么样的类,它继承了哪些类。 public final class HashBiMap extends AbstractMap im...
  • u010185262
  • u010185262
  • 2015-08-04 16:15:19
  • 663

BiMap

转自http://vipcowrie.iteye.com/blog/1521092 BiMap  BiMap是一个有用的集合类型,很简单,它就是一个双向的映射。  反向转换一个Map  ...
  • u010953266
  • u010953266
  • 2015-08-15 14:54:18
  • 993

【项目源码】- 【模仿知乎日报二】吐血高仿知乎日报

对之前的模仿做品进行了改善改善。。。再改善。。。(仅供学习) 多说无益。。。。上图才是王道: 这个东西越模仿发现他的东西就越多,离上次的模仿时间已经过去好久了,这一版本的界面看似好很多,...
  • wduj123
  • wduj123
  • 2016-06-03 18:39:48
  • 1386

HashBIMap双向Map

Goova里实现了双向map,举个例子: package oj2; import com.google.common.collect.HashBiMap; /** * Created by ...
  • ASD991936157
  • ASD991936157
  • 2016-09-16 23:54:23
  • 556

[Google Guava]--Bimap接口

简介:BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射。接口声明以下是com.google.common.collect.Bimap&...
  • w372426096
  • w372426096
  • 2018-03-14 16:03:15
  • 8
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 159万+
    积分: 2万+
    排名: 370
    博客专栏
    最新评论