Guava——Collections New collection types

1.Multiset

在Collection的基礎(chǔ)上囱怕,拓展了對重復(fù)元素的處理方法旦万。

public?interface?Multiset?extends?Collection<E> {

????int?count(@Nullable?Object var1);


????int?add(@Nullable?E var1,?int?var2);


????int?remove(@Nullable?Object var1,?int?var2);


????int?setCount(E var1,?int?var2);


????boolean?setCount(E var1,?int?var2,?int?var3);


????Set<E> elementSet();


????Set<Multiset.Entry<E>> entrySet();


????boolean?equals(@Nullable?Object var1);


????int?hashCode();


????String toString();


????Iterator<E> iterator();


????boolean?contains(@Nullable?Object var1);


????boolean?containsAll(Collection<?> var1);


????boolean?add(E var1);


????boolean?remove(@Nullable?Object var1);


????boolean?removeAll(Collection<?> var1);


????boolean?retainAll(Collection<?> var1);


????public?interface?Entry<E> {

????????E getElement();


????????int?getCount();


????????boolean?equals(Object var1);


????????int?hashCode();


????????String toString();

????}

}

2.Multimap

內(nèi)部實現(xiàn)了Map<K, List<V>>?or?Map<K, Set<V>>,Multimap 提供了一個方便地把一個鍵對應(yīng)到多個值的數(shù)據(jù)結(jié)構(gòu)饶深。

特點:不會有任何鍵映射到空集合:一個鍵要么至少到一個值屁药,要么根本就不在Multimap中。

public?interface?Multimap<K, V> {

????int?size();


????boolean?isEmpty();


????boolean?containsKey(@Nullable?Object var1);


????boolean?containsValue(@Nullable?Object var1);


????boolean?containsEntry(@Nullable?Object var1,?@Nullable?Object var2);


????boolean?put(@Nullable?K var1,?@Nullable?V var2);?//添加單個鍵值對


????boolean?remove(@Nullable?Object var1,?@Nullable?Object var2);?//移除鍵到值的映射迟几,如果有這樣的鍵值就移除并返回true


????boolean?putAll(@Nullable?K var1, Iterable var2);?//依次添加鍵到多個值映射


????boolean?putAll(Multimap


????Collection<V> replaceValues(@Nullable?K var1, Iterable var2);?//清除鍵對應(yīng)的所有值,并重新把key關(guān)聯(lián)到迭代器的每個元素中栏笆,返回元素包含之前所有映射


????Collection<V> removeAll(@Nullable?Object var1);


????void?clear();


????Collection<V> get(@Nullable?K var1);?//得到鍵對應(yīng)的值的集合


????Set<K> keySet();


????Multiset<K> keys();


????Collection<V> values();


????Collection<Entry<K, V>> entries();


????Map<K, Collection<V>> asMap();


????boolean?equals(@Nullable?Object var1);


????int?hashCode();

}

3.BiMap

雙向map类腮,能通過Key與values之間可以互相查找

BiMap接口的實現(xiàn)

public?interface?BiMap?extends?Map<K, V> {

?V put(K key,? V value);?//存放鍵值,存放的值已經(jīng)存在在另一個Key中時會拋出? IllegalArgumentException異常

?V forcePut( K key,? V value);?//強制放入蛉加,會把之前存在的鍵值刪除重新放入存哲。

?void?putAll(Map

?Set values();?//返回值的Set

?BiMap inverse();?//反響查找,即通過調(diào)用反向查找七婴,可以通過.get方法獲得對應(yīng)的key

}

常用實現(xiàn)

HashBiMap: key 集合與 value 集合都有 HashMap 實現(xiàn)

EnumBiMap: key 與 value 都必須是 enum 類型

ImmutableBiMap: 不可修改的 BiMap

4.Table

? ? ?Table是Guava提供的一個接口?Interface Table<R,C,V>,由rowKey+columnKey+value組成?它有兩個鍵察滑,一個值打厘,和一個n行三列的數(shù)據(jù)表類似,n行取決于Table對對象中存儲了多少個數(shù)據(jù)贺辰。個人理解户盯,相當(dāng)于一個二維數(shù)組,行列兩個元素確定一個values值

? ?實際上實現(xiàn)為饲化,Map> 這樣的形式

public?interface?Table<R, C, V> {

????boolean?contains(@Nullable?Object var1,?@Nullable?Object var2);?//類內(nèi)部實現(xiàn)為? 調(diào)用containsRow和containsColumn


????boolean?containsRow(@Nullable?Object var1);


????boolean?containsColumn(@Nullable?Object var1);


????boolean?containsValue(@Nullable?Object var1);





????//以上是確定 是否包含行 列 值


????V get(@Nullable?Object var1,?@Nullable?Object var2);

????// 通過 行列值得到鍵


????boolean?isEmpty();//判斷是否為空


????int?size();?//返回map的 值的個數(shù)


????boolean?equals(@Nullable?Object var1);?


????int?hashCode();


????void?clear();//清除所有 cell


????V put(R var1, C var2, V var3);?//存放


????void?putAll(Table


????V remove(@Nullable?Object var1,?@Nullable?Object var2);?//先用R也就是行去獲得了列的map莽鸭,然后再用列的map去做具體處理。


????Map row(R var1);?//取得 row map


????Map column(C var1);?//取得 colum map


????Set<Table.Cell<R, C, V>> cellSet();


????Set<R> rowKeySet();


????Set<C> columnKeySet();


????Collection values();?//得到Collection


????Map> rowMap();?//返回 列map


????Map> columnMap();?//返回行map


????public?interface?Cell<R, C, V> {

????????R getRowKey();


????????C getColumnKey();


????????V getValue();


????????boolean?equals(@Nullable?Object var1);


????????int?hashCode();

????}

}

5. ClassTolnstanceMap

ClassToInstanceMap提供了一種是用Class作為Key, 對應(yīng)實例作為Value的途徑.他定義了T getInstance(Class<T>)和T putInstance(Class<T> T)兩個方法, 這兩個方法消除了元素類型轉(zhuǎn)換的過程并保證了元素在Map中是類型安全的.

public?interface?ClassToInstanceMap?extends?Map



???? T putInstance(Class var1,?@Nullable?T var2);

}

ClassToInstanceMap<Number> map = MutableClassToInstanceMap.create();

map.putInstance(Integer.class, Integer.valueOf(0));

map.putInstance(Integer.class,?100);

map.putInstance(Float.class,?10.01f);

TestDemo testDemo =?new?TestDemo();


ClassToInstanceMap<TestDemo> map1= MutableClassToInstanceMap.create();

map1.putInstance(TestDemo.class,testDemo);

System.out.println(map.getInstance(Integer.class));

System.out.println(map.getInstance(Float.class));

map1.getInstance(TestDemo.class).show();

//他是一個由B的子類和B的實例構(gòu)成的Map -- 通常, B就是Object

6.RangeSet

RangeSet類是用來存儲一些不為空的也不相交的范圍的數(shù)據(jù)結(jié)構(gòu)

Guava 中定義了 Range Range定義了連續(xù)跨度的范圍邊界吃靠,這個連續(xù)跨度是一個可以比較的類型(Comparable type)硫眨。比如1到100之間的整型數(shù)據(jù)。

Guava Range 概念巢块,范圍和方法

概念表示范圍guava對應(yīng)功能方法

(a..b){x | a < x < b}open(C, C)

[a..b]{x | a <= x <= b}?closed(C, C)

[a..b){x | a <= x < b}closedOpen(C, C)

(a..b]{x | a < x <= b}openClosed(C, C)

(a..+∞){x | x > a}greaterThan(C)

[a..+∞){x | x >= a}atLeast(C)

(-∞..b){x | x < b}lessThan(C)

(-∞..b]{x | x <= b}atMost(C)

(-∞..+∞)all valuesall()

public?interface?RangeSet

????boolean?contains(C var1);


????Range<C> rangeContaining(C var1);


????boolean?encloses(Range<C> var1);


????boolean?enclosesAll(RangeSet<C> var1);


????boolean?isEmpty();


????Range<C> span();


????Set<Range<C>> asRanges();


????RangeSet<C> complement();


????RangeSet<C> subRangeSet(Range<C> var1);


????void?add(Range<C> var1);


????void?remove(Range<C> var1);


????void?clear();


????void?addAll(RangeSet<C> var1);


????void?removeAll(RangeSet<C> var1);


????boolean?equals(@Nullable?Object var1);


????int?hashCode();


????String toString();

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礁阁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子族奢,更是在濱河造成了極大的恐慌姥闭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件越走,死亡現(xiàn)場離奇詭異棚品,居然都是意外死亡靠欢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門铜跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來门怪,“玉大人,你說我怎么就攤上這事疼进⌒嚼拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵伞广,是天一觀的道長拣帽。 經(jīng)常有香客問我,道長嚼锄,這世上最難降的妖魔是什么减拭? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮区丑,結(jié)果婚禮上拧粪,老公的妹妹穿的比我還像新娘。我一直安慰自己沧侥,他們只是感情好可霎,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宴杀,像睡著了一般癣朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旺罢,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天旷余,我揣著相機與錄音,去河邊找鬼扁达。 笑死正卧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跪解。 我是一名探鬼主播炉旷,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叉讥!你這毒婦竟也來了砾跃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤节吮,失蹤者是張志新(化名)和其女友劉穎抽高,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體透绩,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡翘骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年壁熄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳竟。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡草丧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莹桅,到底是詐尸還是另有隱情昌执,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布诈泼,位于F島的核電站懂拾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铐达。R本人自食惡果不足惜岖赋,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓮孙。 院中可真熱鬧唐断,春花似錦、人聲如沸杭抠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偏灿。三九已至丹诀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菩混,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工扁藕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沮峡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓亿柑,卻偏偏與公主長得像邢疙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子望薄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容