链接地址: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")); } }