Apache Commons Collections BidiMap
1.概述
在這篇簡短的文章中,我們將研究Apache Commons Collections庫中一個有趣的數據結構BidiMap 。
BidiMap增加了使用標準Map界面頂部的相應值查找鍵的可能性。
2.依存關係
為了使我們能夠使用BidiMap及其實現,我們需要在項目中包括以下依賴項。對於基於Maven的項目,我們必須在pom.xml中添加以下依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
對於基於Gradle的項目,我們必須將相同的工件添加到我們的build.gradle文件中:
compile 'org.apache.commons:commons-collections4:4.1'
可以在Maven Central上找到此依賴項的最新版本。
3.實現和實例化
BidiMap本身只是一個接口,它定義了雙向地圖特有的行為–當然,可以使用多種實現。
重要的是要了解**BidiMap的實現不允許鍵和值重複*。當BidiMap取*反時,任何重複的值都將轉換為重複的鍵,並且將違反地圖協定。地圖必須始終具有唯一鍵。
讓我們看一下該接口的不同具體實現:
- DualHashBidiMap :此實現使用兩個HashMap實例在內部實現BidiMap 。它使用條目的鍵或值提供對條目的快速查找。但是,必須維護兩個HashMap實例
- DualLinkedHashBidiMap:此實現使用兩個LinkedHashMap實例,因此維護地圖條目的插入順序。如果我們不需要維護地圖條目的插入順序,則可以使用價格便宜的DualHashBidiMap
- TreeBidiMap:此實現是有效的,並且由Red-Black樹實現實現。保證TreeBidiMap的鍵和值使用鍵和值的自然順序升序排序
- 還有DualTreeBidiMap ,它使用TreeMap的兩個實例來實現與TreeBidiMap相同的功能。 DualTreeBidiMap顯然比TreeBidiMap貴
BidiMap接口擴展了java.util.Map接口,因此可以替代它。我們可以使用具體實現的無參數構造函數來實例化具體對象實例。
4.獨特的BidiMap方法
現在,我們已經探索了不同的實現,讓我們看一下該接口特有的方法。
認沽()**插入一個新的鍵值進入地圖**。請注意,如果新條目的值與任何現有條目的值匹配,則將刪除現有條目以支持新條目。
該方法返回刪除的舊條目;如果不存在,則返回null :
BidiMap<String, String> map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);
inverseBidiMap()反轉BidiMap的鍵值對****。此方法返回一個新的BidiMap ,其中的鍵已成為值,反之亦然。此操作在翻譯和字典應用程序中非常有用:
BidiMap<String, String> rMap = map.inverseBidiMap();
assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));
removeValue()用於通過指定值而不是key來刪除映射條目。這是在java.util包中找到的Map實現的補充:
map.removeValue("value2");
assertFalse(map.containsKey("key2"));
我們可以使用getKey()將鍵映射到BidiMap中的特定值。如果沒有鍵映射到指定值,則該方法返回null :
assertEquals(map.getKey("value1"), "key1");
5.結論
本快速教程提供了對Apache Commons Collections庫的了解-特別是在BidiMap ,其實現和特有方法上。
BidiMap最令人興奮和與眾不同的功能是它能夠通過鍵和值查找和操作條目。
與往常一樣,代碼片段可以在GitHub上找到。