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ò)程中詳解。
到此這篇關(guān)于guava中Multimap、HashMultimap使用詳解的文章就介紹到這了,更多相關(guān)guava中Multimap、HashMultimap使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis那些約定的配置你真的都了解嗎(經(jīng)驗(yàn)總結(jié))
mybatsi中Mapper和xml文件之間有很多約定俗稱的規(guī)則,比如名稱匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件2021-06-06SpringBoot實(shí)現(xiàn)阿里云快遞物流查詢的示例代碼
本文將基于springboot實(shí)現(xiàn)快遞物流查詢,物流信息的獲取通過(guò)阿里云第三方實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-10-10Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(48)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08Java設(shè)計(jì)模式之工廠方法模式實(shí)例簡(jiǎn)析
這篇文章主要介紹了Java設(shè)計(jì)模式之工廠方法模式,較為詳細(xì)的分析了Java工廠模式的功能、定義并給出了實(shí)例代碼加以總結(jié)分析,需要的朋友可以參考下2015-11-11使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類
這篇文章主要介紹了使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02如何基于spring security實(shí)現(xiàn)在線用戶統(tǒng)計(jì)
這篇文章主要介紹了如何基于spring security實(shí)現(xiàn)在線用戶統(tǒng)計(jì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java Hibernate對(duì)象(瞬時(shí)態(tài),持久態(tài),脫管態(tài))詳解
這篇文章主要介紹了Java Hibernate對(duì)象(瞬時(shí)態(tài),持久態(tài),脫管態(tài))詳解的相關(guān)資料,這里對(duì)Java Hibernate對(duì)象進(jìn)行了介紹及總結(jié),需要的朋友可以參考下2016-11-11Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式,在java開(kāi)發(fā)中,經(jīng)常遇到需要調(diào)用第三方提供的接口服務(wù)的需求,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-08-08