Guava库学习:学习Collections(六)BiMap与HashBiMap

    链接地址:http://www.xx566.com/detail/145.html

    首先,自我反思一下,半个月来,一直处于浑浑噩噩的状态,各种琐事缠身,很少有时间静下心来继续学习,还好现在处理的差不多了,今天起步入正轨,继续Guava库中Collections的学习,上一篇,我们学习Collections(五)Multimaps:ArrayListMultimap和HashMultimap,今天我们来看一下BiMap以及BiMap的实现HashBiMap。

    

    BiMap是Guava提供的一种key和value双向关联的数据结构,传统的Map我们通过键值获取相应的value,而BiMap则恰恰相反,它允 许我们可以通过特定的value获取key值,翻开源码,我们看到,BiMap是对Map接口的扩展,其继承了Map接口,HashBiMap是基于两个 哈希表的BiMap接口的实现,与传统的HashMap同等重要。

 

    在传统的Map中,我们要求键值唯一,可以通过put方法放入相同的value值,但是在BiMap数据结构中,我们不能通过put方法存入相同的 value值,如果value值重复,就会抛出java.lang.IllegalArgumentException,不过我们可以通过BiMap提供 的forcePut方法,存入相同的value值。同样我们可以通过BiMap提供的inverse方法,进行键值对的反转,值得注意的 是,inverse方法并不返回一个新的BiMap对象,它返回的是与最初BiMap的一种双向映射关系,所有对最初的BiMap的操作都会影响关联后的 BiMap,同样的,对关联后BiMap的操作也影响最初的BiMap。

 

    首先,我们来学习HashBiMap,翻开源码,我们看到,HashBiMap提供了create()静态工厂方法用于HashBiMap的创建,如下:

create():创建具有默认初始容量的新的空HashBiMap。

create(int expectedSize):构造具有期望容量的信息的空HashBiMap。

create(Map<? extends K, ? extends V> map):构造具有足够的容量,与传入Map有相同映射关系的HashBiMap。

 

    另外,还有几个重要的方法,如下:

 containsValue(@Nullable Object value):HashBiMap中是否包含指定的value值。

forcePut(@Nullable K key, @Nullable V value):强制在BiMap中放入具有相同value值的键值对。

inverse():进行键值对的反转,返回BiMap的一种双向映射关系,所有对最初的BiMap的操作都会影响关联后的BiMap,同样的,对关联后BiMap的操作也影响最初的BiMap。

其他的诸如:get()、put()、size()、remove()、clear()、values()、keySet()、entrySet()等常见方法,这里不再赘述。

 

    最后,我们通过简单的实例代码,来深入BiMap和HashBiMap的学习,代码如下:

/**
 * BiMap:key-value双向关联的数据结构。
 * User: Realfighter
 * Date: 2014/10/8
 * Time: 21:47
 */
public class BiMapTest {
 
    @Test
    public void testForcePut() {
        /**
         * create:构造一个空的HashBiMap实例。
         * HashBiMap:基于两个哈希表的BiMap接口的实现
         */
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("testA", "Realfighter");
        try {
            /**
             * 通过put方法存入相同的value值,会抛出异常
             * java.lang.IllegalArgumentException: value already present
             */
            biMap.put("testB", "Realfighter");
        } catch (IllegalArgumentException e) {
            /**
             * forcePut():相同value值允许传入
             */
            biMap.forcePut("testC", "Realfighter");
        }
        System.out.println(biMap.get("testB"));//能够获取到Realfighter
        System.out.println(biMap.get("testC"));//能够获取到Realfighter
 
 
    }
 
    @Test
    public void testInverse() {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("testA", "Realfighter");
        biMap.put("testB", "Realfighter2");
        /**
         * inverse():进行键值对的反转,返回BiMap的一种双向映射关系
         */
        BiMap<String, String> biMap1 = biMap.inverse();
        System.out.println(biMap1.get("Realfighter"));//输出testA
        /**
         * BiMap调用inverse方法后,产生了一种关联关系
         * 所有对最初的BiMap的操作都会影响关联后的BiMap
         */
        //向最初biMap中存入testC
        biMap.put("testC", "Realfighter3");
        //biMap1中获取输出:testC
        System.out.println(biMap1.get("Realfighter3"));
        /**
         * 同样的,对关联后BiMap的操作也影响最初的BiMap
         */
        //向关联后的biMap1中反向存入testD
        biMap1.put("Realfighter4", "testD");
        //biMap中获取输出:Realfighter4
        System.out.println(biMap.get("testD"));
    }
 
}


你可能感兴趣的:(guava,Collections,bimap,HashBiMap)