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