[Guava源码日报](11)BiMap

时间:2021-12-10 16:36:04

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());    }