簡體   English   中英

HashMap和HashMultimap有什么區別

[英]What is difference between HashMap and HashMultimap

我看到很多關於multimap的例子,但不明白Google Gauva為何與眾不同?

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

以上兩者對於保存數據的行為是否相同或不同?

MultiMap<A, B>將類型A的鍵與Collection<B>類型的值相關聯(因此名稱為MultiMap)

Map<A, B>將類型A的鍵與類型B的值相關聯。

因此, MultiMap<Integer, Set<String>>可以被視為Map<Integer, Collection<Set<String>> 通過閱讀api文檔,這一點應該是顯而易見的。

不同之處在於,對於第二個Core Java實現,您需要在插入之前檢查Set是否存在。 Guava的Multimap為您解決了這個問題。

使用Core Java:

Set<String> innerSet = opt.get(key);
if (innerSet == null) {
    innerSet = new HashSet<String>();
    opt.put(key, innerSet);
}
innerSet.add(value);

與番石榴:

opt.put(key, value);

Guava負責初始化一個否則不存在的Set來存儲值,處理任何線程問題(例如,阻止兩個線程並行創建一個新的Set用於同一個鍵)並且還提供了一些你需要的有用方法手動實現,例如獲取所有Set的所有值。

你誤會了什么。 這些甚至不大致相同:

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

在您的示例中, opt4會將單個Integer映射到一組字符串集合。 這正是使用Multimap ,您不必明確處理第二維。 所以事實上,正確的(等效的)聲明是:

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava

你可以得到這樣的地圖視圖:

Map<Integer, Set<String>> mapView = multimap.asMap();

不, MultiMap意味着每個鍵都會附加一組對象。 文檔:Multimap_Is_Not_A_Map

首先,com.google.common.collect.Multimap不是java.util.Map,它位於單獨的層次結構中。

其次,您可以使用Multimap接口所需的Map<Integer, Set<String>>進行所有操作,但您必須自己實現它們,而HashMultimap提供了現成的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM