一、简介
Guava - BiMap
是Guava中新出的集合类型。官网对其描述如下:
The traditional way to map values back to keys is to maintain two separate maps and keep them both in sync, but this is bug-prone and can get extremely confusing when a value is already present in the map
大致意思是:
将值
映射回键
的传统方法是维护两个独立的映射并使它们保持同步,但是这很容易出现bug
,而且当一个值已经出现在映射中时,可能会非常混乱
。For example:
Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();
nameToId.put("Bob", 42);
idToName.put(42, "Bob");
// what happens if "Bob" or 42 are already present?
// weird bugs can arise if we forget to keep these in sync...
BiMap是一个Map,咱可以通过inverse()
方法获取原Map的k - v相反的Map以此来替代上诉场景...
二、BiMap的创建
Guava针对BiMap有多种实现.每种实现针对k -v以及v - k的实现不同.
官方给出的列表如下:
Implementations
Key-Value Map Impl | Value-Key Map Impl | Corresponding BiMap
|
---|---|---|
HashMap |
HashMap |
HashBiMap |
ImmutableMap |
ImmutableMap |
ImmutableBiMap |
EnumMap |
EnumMap |
EnumBiMap |
EnumMap |
HashMap |
EnumHashBiMap |
实验代码:
//通过HashBiMap创建
BiMap<String, String> testHashBiMap = HashBiMap.create();
//通过ImmutableBiMap创建
Map<String,String> normalMap = Maps.newHashMap();
BiMap<String, String> testImmutableBiMap= ImmutableBiMap.copyOf(normalMap);
//通过EnumBiMap创建
BiMap<TestEnum, TestEnum> testEnumBiMap = EnumBiMap.create(TestEnum.class,TestEnum.class);
//通过EnumHashBiMap创建
BiMap<TestEnum, String> testEnumHashBiMap = EnumHashBiMap.create(TestEnum.class);
三、常用方法
1、inverse()
方法
inverse()方法可以获取当前BiMap的键值方向映射的Map.
实验代码:
//通过HashBiMap创建
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyA", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
System.out.println("=================测试BiMap的no - inverse()方法=============" + testHashBiMap);
System.out.println("=================测试BiMap的inverse()方法=============" + testHashBiMap.inverse());
实验结果:
=================测试BiMap的no - inverse()方法============={KeyA=ValueB, KeyC=ValueC}
=================测试BiMap的inverse()方法============={ValueB=KeyA, ValueC=KeyC}
2、put()
方法
put()
方法对BiMap添加一个key - value映射
值得注意的是:如果添加不同的key但是value在之前的key中已经存在的话,会抛出IllegalArgumentException
异常.
实验代码:
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyA", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
testHashBiMap.put("KeyD", "ValueB");
实验结果:
Exception in thread "main" java.lang.IllegalArgumentException: value already present: ValueB
at com.google.common.collect.HashBiMap.put(HashBiMap.java:285)
at com.google.common.collect.HashBiMap.put(HashBiMap.java:260)
at com.toxic.anepoch.guava.parsing.collection.newtypes.TestBiMap.main(TestBiMap.java:30)
3、forcePut()
方法
forcePut()
方法是作为put()
方法的补充,之前在put()
方法中提到了,value需要保持唯一,但是当我们实际使用中的时候,如果想在后来增加的key中使用已经存在的value就可以forcePut()
方法.使用之后它会将已经存在与new value值相同的key给移除掉.
实验代码:
//通过HashBiMap创建
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyB", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
System.out.println("=================测试BiMap的no - inverse()方法=============" + testHashBiMap);
testHashBiMap.forcePut("KeyD", "ValueB");
System.out.println("=================测试BiMap的no - inverse()方法=============" + testHashBiMap);
实验结果:
=================测试BiMap的no - inverse()方法============={KeyA=ValueA, KeyB=ValueB, KeyC=ValueC}
=================测试BiMap的no - inverse()方法============={KeyA=ValueA, KeyC=ValueC, KeyD=ValueB}
从实验结果中可以发现.以前持有ValueB的Key为KeyB,使用了forcePut()
方法之后其对应的持有Key变为了KeyD.
Note: BiMap
utilities like synchronizedBiMap
live in Maps
.
......未完待续