guava中產生了jdk中沒有的新集合,並且是普遍使用的,這些都能和jdk中集合框架共存,沒有將這些硬結合到jdk的抽象集合。java
一般,guava集合實現了jdk的接口,緊密的結合到了一塊兒框架
傳統的java中統計文檔中單詞出現的次數的方式以下:ui
String []words=new String[5000];spa
Map<String,Integer> counts=new HashMap<String,Integer>();對象
for(String word:words){接口
Integer count=counts.get(word);隊列
if(count==null){ci
counts.put(word,1);element
}else {開發
counts.put(word,count+1);
}
}
這樣的寫法,不支持各類有用的統計,比方說總量,咱們可以作的更好。
guava 提供了新的類型multiset,支持添加多種元素,在統計學中,是集合概念的衍生物,容許其中的元素能夠出現屢次。在multiset中和在tuples中相反,元素的順序是不相關的,{a,a,b}和{a,b,a}是相同的
有兩種看待問題的方式:
1.這是一個隊列,其中元素的順序沒有關係
2.這是一個map,有元素和個數
guava's MultisetAPI將兩種想法結合到一塊兒:
看成普通的集合時,Multiset像一個和順序無關的arraylist:
1.調用add(E) 時增長指定元素
2.迭代器遍歷每個出現的元素
3.size()方法返回的是全部元素全部的出現次數
另外的查詢操做,統計方式,和Map<E,Integer>中所指望的一致
count(object) 返回和元素相關的個數,如hashMultiset 統計的時間複雜度爲O(1),對於TreeMultiset,統計的時間複雜度是O(log n).
entrySet() 返回一個Set<Multiset.Entry<E>> ,和map中的entrySet相似
multiset所消耗的空間複雜度是線性的,和其中惟一元素的個數有關
毫無疑問,multiset和collection接口有關,TreeMultiSet和TreeSet相似,相對jdk而言使用起來更加簡單
MultiSet 不是一個map
Multiset<E> 不是一個Map<E,Integer>,雖然可能有一部分相關的實現,Multiset是一個Collection 類型,知足全部已經定義的
方式,其餘明顯的不一樣體如今下面幾點:
multiset<E> 只有正數的數量,沒有元素的count屬性返回的爲負數類型,若是count的值爲0表示multiset中沒有相關的元素,這個值也不會出如今elementSet()和entrySet()中
multiset.size() 返回集合中全部元素個數,對於每一個元素的個數類型可使用elementSet().size()
multiset.iterator 迭代器遍歷每個出現的元素,因此迭代的大小和multiset.size()相等
multiset<E>支持添加元素,移除元素,或直接設置元素的個數,setCount(ele,0)和移除集合中的相關全部元素方法效果一致
multiset.count(elem) 若是相關集合中沒有元素返回0
jdk和guava中元素徹底適配
sortedMultiset
sortedMultiset是multiset接口的演變,支持指定範圍的子集合構造,例如,可使用latencies.subMultiset(0,BoudType.CLOSED,100,BoundType.OPEN).size() 查詢出在100毫秒內相關的數據,並經過.size()方法計算出相關的比例.
TreeMultiset實現了sortedMultiset.
Multimap
每個開發人員都哦會經歷這樣的問題,實現了Map<K,List<V>> or Map<K,Set<V>> ,還得處理這樣複雜的結構
例如,Map<K,Set<V>> 一種特殊的方式處理未標記的有向圖。Guava's Multimap結構讓處理keys 映射多個values處理更加簡單
有兩種方式考慮Multimap的概念:是一個key到value的映射
a -> 1 a -> 2 a -> 4 b -> 3 c -> 5
或者是從一個惟一key到多個value集合的映射
a -> [1, 2, 4] b -> [3] c -> [5]
不多直接使用Multimap接口,常用ListMultimap 或者SetMultimap,分別映射keys到list或set
construction 構建
直接建立Multimao是使用MultimapBuilder ,指定kes和values是如何使用的
// creates a ListMultimap with tree keys and array list values ListMultimap<String, Integer> treeListMultimap = MultimapBuilder.treeKeys().arrayListValues().build(); // creates a SetMultimap with hash keys and enum set values SetMultimap<Integer, MyEnum> hashEnumMultimap = MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();
modifying 修改
multimap.get(key) 返回與key相關的list或者set
修改
Set<Person> aliceChildren = childrenMultimap.get(alice); aliceChildren.clear(); aliceChildren.add(bob); aliceChildren.add(carol);
multimap支持一些其餘有用方法
asMap 將每個Multiamp<K,V>看做一個Map<K,Collection<V>> ,返回的map支持
remove和返回集合對象的修改,可是不支持put和putall方法,可使用asMap().get(key)
獲取null而不是一個新的,可寫入的空的集合,同時也有相關集合的轉化 Set 和MultiSet
List和ListMultimap 可是不容許ListMultimap返回一個Map<K,List<V>>類型
entries 實體 Collection<Map,Entry<K,V>> 返回全部Multimap中的實體
keySet 返回Multimap中的惟一的set集合;
keys返回multimap中全部的key存爲一個multiset,可以刪除,可是不可以添加
values() 返回全部的集合信息
BiMap
BiMap時一個 Map<K,V>
容許你反過來使用 BiMap<V,K> 經過inverser()
保證值是惟一的,values()是一個Set
若是放入一個已經存在的key,則會拋出異常,若是想要刪除存在的實體,使用forcePut(key,value)代替
BiMap<String,Integer> userId= HashBiMap.create();
String userForId=userId.inverse().get(2);
Table
當要同時使用多個key的時候,可能用到的結構是Map<FirstName,Map<LaseName,Person>>,這樣的結構看起來
很難使用,guava提供了新的集合類型table,支持row類型和column類型,table支持多角度去使用數據
rowMap 將Table<R,C,V> 當作是Map<R,Map<C,V>>,rowKeySet()返回Set<R>
row(r) 返回非空的Map<C,V>,
不少類型的table實現
HashBasedTable
TreeBasedTable
ImmutableTable
ArrayTable
ClassToINstanceMap
map keys有時候不是同一種類型,想要匹配相關的值,guava提供了相關的類型
ClassToInstanceMap
除了實現map接口,ClassTOINstanceMap提供了 T getInstance(Class<T>) 和T putINstance(Class<T> ,T)。
ClassToInstanceMap有一個單獨的類型參數,叫作B,表明了map中指定的相關類型
ClassToInstanceMap<Number> numberDefaults=MutableClassToInstanceMap.create();
numberDefaults.putInstance(Integer.class,Integer.valueOf(0));
}
RangeSet
一個rangeSet表示一個不連續的,非空的區間值。當添加一個區間的數值到rangeSet,其餘範圍的值就會鏈接到一塊兒,空的範圍就會被忽略
RangeMap