guava中Multimap、HashMultimap用法小結(jié)
在介紹Multimap之前我們先說(shuō)一下Map,Map是一個(gè)key、value類型的鍵值對(duì)集合,集合中key不可以重復(fù),但value可以重復(fù),如果我們想在Map集合中存入一個(gè)相同的key,不同的value值得時(shí)候就必須使用 Map<Integer,,list<Object>>Map<Integer,List<Object>>模式來(lái)存數(shù)據(jù),這樣做很麻煩,而且編程效率又很低;
1. 現(xiàn)在我們來(lái)介紹一種更高效的集合Multimap
它可以很簡(jiǎn)單的實(shí)現(xiàn)上面我們所說(shuō)的功能,先看下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和當(dāng)前的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接口的實(shí)現(xiàn)類HashMultimap使用方法詳解
- 創(chuàng)建HashMultimap對(duì)象
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]}從上面的結(jié)果集可以看出,key不可以重復(fù),相同key的key-value pair 的value值是放在同一個(gè)數(shù)組中,相同的value會(huì)去重。
- 常用的方法示例
//判斷集合中是否存在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的集合,重復(fù)的key將會(huì)用key * num的方式來(lái)表示
Multiset<Integer> set = map.keys();
System.out.println(set);
//返回集合中所有不重復(fù)的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方法會(huì)替換掉key的value值,并且返回之前對(duì)應(yīng)的值。
2. ImmutableMultimap不可變集合
ImmutableMultimap中提供了三個(gè)主要的靜態(tài)方法of、builder、copyof;
//創(chuàng)建一個(gè)靜態(tài)不可變的Multimap對(duì)象
Multimap<Integer, Integer> map = ImmutableMultimap.<Integer, Integer>of();
Multimap<Integer, Integer> map1 = ImmutableMultimap.<Integer, Integer>builder().build();
//從另外一個(gè)集合中復(fù)制數(shù)據(jù)元素到Multimap對(duì)象中
Multimap<Integer, Integer> map2 = ImmutableMultimap.copyOf(map);3.LinkedHashMultimap實(shí)現(xiàn)類
LinkedHashMultimap實(shí)現(xiàn)類與HashMultimap類的實(shí)現(xiàn)方法一樣,唯一的區(qū)別是LinkedHashMultimap保存了記錄的插入順序,在使用Iterator循環(huán)遍歷的時(shí)候先得到的肯定是先放入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);運(yùn)行結(jié)果是:
{4=[5, 3, 4, 2, 1, 56], 3=[3, 4, 2, 6, 8, 7], 1=[2]}
4.TreeMultimap實(shí)現(xiàn)類
TreeMultimap類繼承成了Multimap接口,它的所有方法跟HashMultimap一樣,但是有一點(diǎn)不同的是該類實(shí)現(xiàn)了SortedSetMultimap接口,該接口會(huì)將存入的數(shù)據(jù)按照自然排序,默認(rèn)是升序。
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);返回的結(jié)果是:
{1=[2], 3=[2, 3, 4, 6, 7, 8], 4=[1, 2, 3, 4, 5, 56]}
Multimap接口的實(shí)現(xiàn)類不僅僅只有HashMultimap、TreeMultimap、LinkedHashMultimap、ImmutableMultimap這幾種,還有其它的實(shí)現(xiàn)類,我會(huì)在以后的學(xué)習(xí)過程中詳解。
到此這篇關(guān)于guava中Multimap、HashMultimap使用詳解的文章就介紹到這了,更多相關(guān)guava中Multimap、HashMultimap使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot升級(jí)到j(luò)dk21最新教程(2023年)
你還在使用jdk8?快來(lái)看看最新出爐的SpringBoot+jdk21如何使用,下面這篇文章主要給大家介紹了關(guān)于springboot升級(jí)到j(luò)dk21的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
IDEA提示 add *** to custom tags問題及解決
文章介紹了如何在文檔注釋中添加自定義注解(@xxx),并提供了添加和刪除注解的方法,總結(jié)了個(gè)人經(jīng)驗(yàn),希望對(duì)大家有所幫助2024-12-12
工廠方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了工廠方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-08-08
spring+maven實(shí)現(xiàn)郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了spring+maven實(shí)現(xiàn)郵件發(fā)送,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
spring boot openfeign從此和httpClient說(shuō)再見詳析
這篇文章主要給大家介紹了關(guān)于spring boot openfeign從此和httpClient說(shuō)再見的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-06-06
必須詳細(xì)與全面的Java開發(fā)環(huán)境搭建圖文教程
本篇文章內(nèi)容包括:Linux理論與實(shí)操,MySQL實(shí)操,JDK實(shí)操,Tomcat實(shí)操和Tomcat實(shí)操,需要的朋友可以參考下2019-11-11

