guava中Multimap、HashMultimap用法小結
在介紹Multimap之前我們先說一下Map,Map是一個key、value類型的鍵值對集合,集合中key不可以重復,但value可以重復,如果我們想在Map集合中存入一個相同的key,不同的value值得時候就必須使用 Map<Integer,,list<Object>>Map<Integer,List<Object>>模式來存數(shù)據(jù),這樣做很麻煩,而且編程效率又很低;
1. 現(xiàn)在我們來介紹一種更高效的集合Multimap
它可以很簡單的實現(xiàn)上面我們所說的功能,先看下Multimap接口的源碼
@GwtCompatible public interface Multimap<K, V> { //返回Multimap集合的key、value pair的數(shù)量 int size(); //判斷Multimap是否包含key、value pair boolean isEmpty(); //判斷Multimap中是否包含指定key的value值 boolean containsKey(@Nullable Object key); //判斷Multimap中是否包含指定value的key boolean containsValue(@Nullable Object value); //判斷Multimap中是否包含指定的key-value pair的數(shù)據(jù) boolean containsEntry(@Nullable Object key, @Nullable Object value); //將數(shù)據(jù)加入到Multimap中 boolean put(@Nullable K key, @Nullable V value); //刪除Multimap中指定key-value pair boolean remove(@Nullable Object key, @Nullable Object value); //將指定的key-集合數(shù)據(jù)加入Multimap中 boolean putAll(@Nullable K key, Iterable<? extends V> values); //將指定的Multimap和當前的Multimap合并 boolean putAll(Multimap<? extends K, ? extends V> multimap); //替換指定key的value Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values); //刪除Imultimap中的指定key數(shù)據(jù) Collection<V> removeAll(@Nullable Object key); //清空Imultimap中的數(shù)據(jù) void clear(); //獲取指定key的值 Collection<V> get(@Nullable K key); //獲取所有的key集合 Set<K> keySet(); Multiset<K> keys(); Collection<V> values(); Collection<Map.Entry<K, V>> entries(); Map<K, Collection<V>> asMap(); @Override boolean equals(@Nullable Object obj); @Override int hashCode(); }
Multimap接口的實現(xiàn)類HashMultimap使用方法詳解
- 創(chuàng)建HashMultimap對象
Multimap<Integer, Integer> map = HashMultimap.<Integer, Integer>create(); map.put(1, 2); map.put(1, 2); map.put(1, 3); map.put(1, 4); map.put(2, 3); map.put(3, 3); map.put(4, 3); map.put(5, 3); System.out.println(map);
{1=[4, 2, 3], 2=[3], 3=[3], 4=[3], 5=[3]}
從上面的結果集可以看出,key不可以重復,相同key的key-value pair 的value值是放在同一個數(shù)組中,相同的value會去重。
- 常用的方法示例
//判斷集合中是否存在key-value為指定值得元素 System.out.println(map.containsEntry(1, 2)); System.out.println(map.containsEntry(1, 6)); //獲取key為1的value集合 Collection<Integer> list = map.get(1); System.out.println(list); //返回集合中所有key的集合,重復的key將會用key * num的方式來表示 Multiset<Integer> set = map.keys(); System.out.println(set); //返回集合中所有不重復的key的集合 Set<Integer> kset = map.keySet(); System.out.println(kset);
true false [4, 2, 3] [1 x 3, 2 x 2, 3, 4, 5] [1, 2, 3, 4, 5]
replaceValues替換Multimap中指定key的值
Collection<Integer> coll = map.replaceValues(1, Arrays.asList(1,7,8,9,10)); System.out.println(coll); System.out.println(map);
[4, 2, 3] {1=[8, 9, 1, 10, 7], 2=[4, 3], 3=[3], 4=[3], 5=[3]}
replaceValues方法會替換掉key的value值,并且返回之前對應的值。
2. ImmutableMultimap不可變集合
ImmutableMultimap中提供了三個主要的靜態(tài)方法of、builder、copyof;
//創(chuàng)建一個靜態(tài)不可變的Multimap對象 Multimap<Integer, Integer> map = ImmutableMultimap.<Integer, Integer>of(); Multimap<Integer, Integer> map1 = ImmutableMultimap.<Integer, Integer>builder().build(); //從另外一個集合中復制數(shù)據(jù)元素到Multimap對象中 Multimap<Integer, Integer> map2 = ImmutableMultimap.copyOf(map);
3.LinkedHashMultimap實現(xiàn)類
LinkedHashMultimap實現(xiàn)類與HashMultimap類的實現(xiàn)方法一樣,唯一的區(qū)別是LinkedHashMultimap保存了記錄的插入順序,在使用Iterator循環(huán)遍歷的時候先得到的肯定是先放入Multimap中的數(shù)據(jù)。
Multimap<Integer, Integer> map = LinkedHashMultimap.<Integer, Integer>create(); map.putAll(4, Arrays.asList(5,3,4,2,1,56)); map.putAll(3, Arrays.asList(3,4,2,6,8,7)); map.put(1, 2); System.out.println(map);
運行結果是:
{4=[5, 3, 4, 2, 1, 56], 3=[3, 4, 2, 6, 8, 7], 1=[2]}
4.TreeMultimap實現(xiàn)類
TreeMultimap類繼承成了Multimap接口,它的所有方法跟HashMultimap一樣,但是有一點不同的是該類實現(xiàn)了SortedSetMultimap接口,該接口會將存入的數(shù)據(jù)按照自然排序,默認是升序。
Multimap<Integer, Integer> map = TreeMultimap.<Integer, Integer>create(); map.putAll(4, Arrays.asList(5,3,4,2,1,56)); map.putAll(3, Arrays.asList(3,4,2,6,8,7)); map.put(1, 2); System.out.println(map);
返回的結果是:
{1=[2], 3=[2, 3, 4, 6, 7, 8], 4=[1, 2, 3, 4, 5, 56]}
Multimap接口的實現(xiàn)類不僅僅只有HashMultimap、TreeMultimap、LinkedHashMultimap、ImmutableMultimap這幾種,還有其它的實現(xiàn)類,我會在以后的學習過程中詳解。
到此這篇關于guava中Multimap、HashMultimap使用詳解的文章就介紹到這了,更多相關guava中Multimap、HashMultimap使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis那些約定的配置你真的都了解嗎(經(jīng)驗總結)
mybatsi中Mapper和xml文件之間有很多約定俗稱的規(guī)則,比如名稱匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件2021-06-06SpringBoot實現(xiàn)阿里云快遞物流查詢的示例代碼
本文將基于springboot實現(xiàn)快遞物流查詢,物流信息的獲取通過阿里云第三方實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2021-10-10使用spring動態(tài)獲取接口的不同實現(xiàn)類
這篇文章主要介紹了使用spring動態(tài)獲取接口的不同實現(xiàn)類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02如何基于spring security實現(xiàn)在線用戶統(tǒng)計
這篇文章主要介紹了如何基于spring security實現(xiàn)在線用戶統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解
這篇文章主要介紹了Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解的相關資料,這里對Java Hibernate對象進行了介紹及總結,需要的朋友可以參考下2016-11-11