一、簡介
Guava - BiMap是Guava中新出的集合類型。官網(wǎng)對(duì)其描述如下:
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
大致意思是:
將值映射回鍵的傳統(tǒng)方法是維護(hù)兩個(gè)獨(dú)立的映射并使它們保持同步,但是這很容易出現(xiàn)bug,而且當(dāng)一個(gè)值已經(jīng)出現(xiàn)在映射中時(shí),可能會(huì)非常混亂。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是一個(gè)Map,咱可以通過inverse()方法獲取原Map的k - v相反的Map以此來替代上訴場(chǎng)景...
二、BiMap的創(chuàng)建
Guava針對(duì)BiMap有多種實(shí)現(xiàn).每種實(shí)現(xiàn)針對(duì)k -v以及v - k的實(shí)現(xiàn)不同.
官方給出的列表如下:
Implementations
| Key-Value Map Impl | Value-Key Map Impl | Corresponding BiMap
|
|---|---|---|
HashMap |
HashMap |
HashBiMap |
ImmutableMap |
ImmutableMap |
ImmutableBiMap |
EnumMap |
EnumMap |
EnumBiMap |
EnumMap |
HashMap |
EnumHashBiMap |
實(shí)驗(yàn)代碼:
//通過HashBiMap創(chuàng)建
BiMap<String, String> testHashBiMap = HashBiMap.create();
//通過ImmutableBiMap創(chuàng)建
Map<String,String> normalMap = Maps.newHashMap();
BiMap<String, String> testImmutableBiMap= ImmutableBiMap.copyOf(normalMap);
//通過EnumBiMap創(chuàng)建
BiMap<TestEnum, TestEnum> testEnumBiMap = EnumBiMap.create(TestEnum.class,TestEnum.class);
//通過EnumHashBiMap創(chuàng)建
BiMap<TestEnum, String> testEnumHashBiMap = EnumHashBiMap.create(TestEnum.class);
三、常用方法
1、inverse()方法
inverse()方法可以獲取當(dāng)前BiMap的鍵值方向映射的Map.
實(shí)驗(yàn)代碼:
//通過HashBiMap創(chuàng)建
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyA", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);
System.out.println("=================測(cè)試BiMap的inverse()方法=============" + testHashBiMap.inverse());
實(shí)驗(yàn)結(jié)果:
=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueB, KeyC=ValueC}
=================測(cè)試BiMap的inverse()方法============={ValueB=KeyA, ValueC=KeyC}
2、put()方法
put()方法對(duì)BiMap添加一個(gè)key - value映射
值得注意的是:如果添加不同的key但是value在之前的key中已經(jīng)存在的話,會(huì)拋出IllegalArgumentException異常.
實(shí)驗(yàn)代碼:
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyA", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
testHashBiMap.put("KeyD", "ValueB");
實(shí)驗(yàn)結(jié)果:
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()方法的補(bǔ)充,之前在put()方法中提到了,value需要保持唯一,但是當(dāng)我們實(shí)際使用中的時(shí)候,如果想在后來增加的key中使用已經(jīng)存在的value就可以forcePut()方法.使用之后它會(huì)將已經(jīng)存在與new value值相同的key給移除掉.
實(shí)驗(yàn)代碼:
//通過HashBiMap創(chuàng)建
BiMap<String, String> testHashBiMap = HashBiMap.create();
testHashBiMap.put("KeyA", "ValueA");
testHashBiMap.put("KeyB", "ValueB");
testHashBiMap.put("KeyC", "ValueC");
System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);
testHashBiMap.forcePut("KeyD", "ValueB");
System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);
實(shí)驗(yàn)結(jié)果:
=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueA, KeyB=ValueB, KeyC=ValueC}
=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueA, KeyC=ValueC, KeyD=ValueB}
從實(shí)驗(yàn)結(jié)果中可以發(fā)現(xiàn).以前持有ValueB的Key為KeyB,使用了forcePut()方法之后其對(duì)應(yīng)的持有Key變?yōu)榱薑eyD.
Note: BiMap utilities like synchronizedBiMap live in Maps.
......未完待續(xù)