[Guava源码日报](11)BiMap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/71080423

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());
    }
阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页