Guava中的集合

文章引用:http://ifeve.com/google-guava-immutablecollections/

一灵临、 不可變集合

為什么要使用不可變集合

  • 優(yōu)點(diǎn)

    1. 當(dāng)對象被不可信的庫調(diào)用時,不可變形式是安全的赫蛇;
    2. 不可變對象被多個線程調(diào)用時返吻,不存在競態(tài)條件問題挫剑;
    3. 不可變集合不需要考慮變化,因此可以節(jié)省時間和空間藤为。所有不可變的集合都比它們的可變形式有更好的內(nèi)存利用率;
    4. 不可變對象因?yàn)橛泄潭ú蛔兌嵝蹋梢宰鳛槌A縼戆踩褂谩?/li>
  • 不可變集合的幾種創(chuàng)建方式
    copyOf方法

List<String> list = Arrays.asList("a", "b", "c");
ImmutableSet<String> strings = ImmutableSet.copyOf(list);

of方法

ImmutableSet<String> of = ImmutableSet.of("a", "b", "c", "d", "e");

Builder工具

ImmutableSet<String> set = ImmutableSet.<String>builder().add("a").add("b").add("c").build();

二缅疟、 新的集合類型

可變集合與不可變集合(來自并發(fā)編程網(wǎng)).png

1.Multiset

Multiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("a");
multiset.add("b");
int a = multiset.count("a");
System.out.println("包含重復(fù)元素的個數(shù)  " + multiset.size());
System.out.println("不包含重復(fù)元素的個數(shù) " + multiset.elementSet().size());
// 可以統(tǒng)計每個元素出現(xiàn)的個數(shù)
System.out.println("元素a出現(xiàn)的次數(shù) " + a);
----------------------------------
out:
    包含重復(fù)元素的個數(shù)  3
    不包含重復(fù)元素的個數(shù) 2
    元素a出現(xiàn)的次數(shù) 2

Guava 提供了多種Multiset實(shí)現(xiàn)

Multiset的多種實(shí)現(xiàn).png

SortedMultiset
SortedMultiset是Multiset 接口的變種,它支持高效地獲取指定范圍的子集遍愿。
eg:

SortedMultiset<String> sortedMultiset = TreeMultiset.create();
sortedMultiset.add("a");
sortedMultiset.add("b");
sortedMultiset.add("c");
sortedMultiset.add("d");
sortedMultiset.add("e");
SortedMultiset<String> strings = sortedMultiset.subMultiset("a", BoundType.CLOSED, "e", BoundType.OPEN);
strings.forEach(System.out::print);
----------------------------------
out:
    輸出:abcd

2.Multimap

        ArrayListMultimap<String, Integer> multimap = ArrayListMultimap.create();
        multimap.put("a", 1);
        multimap.put("a", 2);
        multimap.put("a", 3);
        multimap.put("a", 4);
        multimap.put("b", 1);
        System.out.println(multimap.size());

        //  asMap() 提供Map<K,Collection<V>>形式的視圖 collections 中
        //  a->{1,2,3,4}
        //  b->{1}
        Collection<Collection<Integer>> collections = multimap.asMap().values();

        // values {1,2,3,4,1}
        Collection<Integer> values = multimap.values();

        Collection<Map.Entry<String, Integer>> entries = multimap.entries();
        entries.forEach(item -> {
            System.out.print("key--->" + item.getKey());
            System.out.println("  value--->" + item.getValue());
        });
----------------------------------
        out:
              5
              key--->a  value--->1
              key--->a  value--->2
              key--->a  value--->3
              key--->a  value--->4
              key--->b  value--->1

Multimap的各種實(shí)現(xiàn)


Multimap的各種實(shí)現(xiàn).png

3.RangeSet

        RangeSet<Integer> rangeSet = TreeRangeSet.create();
        // 閉區(qū)間 [1,10]
        rangeSet.add(Range.closed(1, 10));
        // 左閉右開區(qū)間 [11,15) 如果左邊為11 則和上邊的區(qū)間為不連續(xù)區(qū)間  如果左邊為10 則兩個區(qū)間進(jìn)行合并
        rangeSet.add(Range.closedOpen(11, 15));
        // 返回包含指定元素的區(qū)間存淫,如果沒有這樣的區(qū)間則返回null
        Range<Integer> integerRange = rangeSet.rangeContaining(5);
        // 返回包含rangeSet 所有區(qū)間的最小區(qū)間
        Range<Integer> span = rangeSet.span();
        System.out.println(integerRange);
        System.out.println(span);
---------------------------------                
out:
      [1..10]
      [1..15)

還存在一個RangeMap<Integer, String> ,但是和RangeSet不同的是RangeMap不會合并相鄰的映射沼填,即便相鄰的區(qū)間映射到相同的值桅咆。


4.Table

        Table<String, Integer, String> table = HashBasedTable.create();
        table.put("a", 1, "第一個值");
        table.put("a", 2, "第二個值");
        table.put("a", 3, "第三個值");
        table.put("b", 1, "第一個值");
        table.put("b", 4, "第四個值");

        Map<Integer, String> a = table.row("a");
        Map<Integer, String> b = table.row("b");
        Map<String, String> column = table.column(1);
        Set<Table.Cell<String, Integer, String>> cells = table.cellSet();
        Map<Integer, Map<String, String>> columnMap = table.columnMap();
        Collection<String> values = table.values();
        System.out.println("");

Table:output

Table的多種實(shí)現(xiàn)


Table的多種實(shí)現(xiàn).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坞笙,隨后出現(xiàn)的幾起案子岩饼,更是在濱河造成了極大的恐慌,老刑警劉巖薛夜,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籍茧,死亡現(xiàn)場離奇詭異,居然都是意外死亡梯澜,警方通過查閱死者的電腦和手機(jī)寞冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晚伙,“玉大人吮龄,你說我怎么就攤上這事∨亓疲” “怎么了漓帚?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長民傻。 經(jīng)常有香客問我胰默,道長,這世上最難降的妖魔是什么漓踢? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任牵署,我火速辦了婚禮,結(jié)果婚禮上喧半,老公的妹妹穿的比我還像新娘奴迅。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布取具。 她就那樣靜靜地躺著脖隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暇检。 梳的紋絲不亂的頭發(fā)上产阱,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機(jī)與錄音块仆,去河邊找鬼构蹬。 笑死,一個胖子當(dāng)著我的面吹牛悔据,可吹牛的內(nèi)容都是我干的庄敛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼科汗,長吁一口氣:“原來是場噩夢啊……” “哼藻烤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起头滔,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤怖亭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拙毫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體依许,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年缀蹄,在試婚紗的時候發(fā)現(xiàn)自己被綠了峭跳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缺前,死狀恐怖蛀醉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衅码,我是刑警寧澤拯刁,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站逝段,受9級特大地震影響垛玻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奶躯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一帚桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘹黔,春花似錦账嚎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疼邀。三九已至,卻和暖如春召锈,著一層夾襖步出監(jiān)牢的瞬間旁振,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工烟勋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留规求,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓卵惦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓦戚。 傳聞我的和親對象是個殘疾皇子沮尿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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

  • 不可變集合類 為什么要使用不可變集合不可變對象有很多優(yōu)點(diǎn),包括: 當(dāng)對象被不可信的庫調(diào)用時较解,不可變形式是安全的畜疾;不...
    icecrea閱讀 1,608評論 0 0
  • com.google.common.collect 1、不可變集合 何為“不可變” 無法修改返回容器的內(nèi)容印衔,注意啡捶,...
    拾壹北閱讀 2,592評論 0 4
  • Guava簡單介紹 1 資料鏈接 極客學(xué)院http://wiki.jikexueyuan.com/project/...
    田園小丁閱讀 1,825評論 0 3
  • [toc] guava: google 的開源工具包 幫助編寫常用方法 hashCode,equals奸焙,toStr...
    喧囂的風(fēng)兒閱讀 869評論 0 0
  • 前不久瞎暑。有個演員叫著范xx。獲得了一個什么國家精神造就獎与帆。沒事了就百度了一下了赌。國家精神造就究竟是什么呢?可以分開來...
    世界杯之旅閱讀 413評論 0 5