Guava多圖指南
1.概述
在本文中,我們將研究Google Guava庫中的Map實現之一– Multimap 。它是一個將鍵映射到值的集合,類似於java.util.Map ,但是其中每個鍵都可以與多個值關聯。
2. Maven依賴
首先,讓我們添加一個依賴項:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
最新版本可在此處找到。
3. Multimap之實施
對於Guava Multimap,如果我們為同一個鍵添加兩個值,則第二個值將不會覆蓋第一個值。相反,我們在結果map中將有兩個值。讓我們看一個測試用例:
String key = "a-key";
Multimap<String, String> map = ArrayListMultimap.create();
map.put(key, "firstValue");
map.put(key, "secondValue");
assertEquals(2, map.size());
打印Map內容將輸出:
{a-key=[firstValue, secondValue]}
當我們通過鍵“ a-key”獲取值時,將得到Collection
Collection<String> values = map.get(key);
打印值將輸出:
[firstValue, secondValue]
4.與標準Map相比
java.util包中的標準映射無法使我們能夠將多個值分配給同一鍵。讓我們考慮一個簡單的例子,當我們使用相同的鍵將兩個值放入()到Map中時:
String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();
map.put(key, "firstValue");
map.put(key, "secondValue");
assertEquals(1, map.size());
由於第二個put()操作將覆蓋第一個值,因此生成的映射僅具有一個元素( “ secondValue”) 。如果我們想要實現與Guava的Multimap相同的行為,我們將需要創建一個以List
String key = "a-key";
Map<String, List<String>> map = new LinkedHashMap<>();
List<String> values = map.get(key);
if(values == null) {
values = new LinkedList<>();
values.add("firstValue");
values.add("secondValue");
}
map.put(key, values);
assertEquals(1, map.size());
顯然,使用起來不是很方便。而且,如果我們的代碼中有此需求,那麼Guava的Multimap可能比java.util.Map更好。
這裡要注意的一件事是,儘管我們有一個包含兩個元素的列表,但size()方法返回1。在Multimap中,size()返回存儲在Map中的實際值個數,但keySet()。size ()返回不同鍵的數量。
5. Multimap的優點
多重Map通常用於原本會出現Map <K,Collection
- 在使用put()添加條目之前,無需填充空集合。
- get()方法從不返回null ,而僅返回一個空集合(我們不需要像Map <String,Collection
>測試用例那樣對null 進行檢查) - 當且僅當鍵映射到至少一個值時,該鍵才包含在Multimap中。任何導致鍵具有零關聯值的操作都具有從Multimap中刪除該鍵的效果(在Map <String,Collection
>中, 即使我們從集合中刪除了所有值,我們仍然保留一個空的Collection作為一個值,這是不必要的內存開銷) - 總條目值計數可作為size()獲得
六,結論
本文介紹瞭如何以及何時使用Guava Multimap。它將其與標準java.util.Map進行比較,並顯示了Guava Multimap的優點。
所有這些示例和代碼片段都可以在GitHub項目中找到–這是一個Maven項目,因此應易於導入和運行。