![](/img/trans.png)
[英]What is the difference between HashMap<Long, String> and HashMap<>?
[英]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.