Guava中的集合

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

一、 不可變集合

為什么要使用不可變集合

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

    1. 當(dāng)對象被不可信的庫調(diào)用時(shí),不可變形式是安全的;
    2. 不可變對象被多個(gè)線程調(diào)用時(shí),不存在競態(tài)條件問題;
    3. 不可變集合不需要考慮變化,因此可以節(jié)省時(shí)間和空間。所有不可變的集合都比它們的可變形式有更好的內(nèi)存利用率;
    4. 不可變對象因?yàn)橛泄潭ú蛔?,可以作為常量來安全使用?/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ù)元素的個(gè)數(shù)  " + multiset.size());
System.out.println("不包含重復(fù)元素的個(gè)數(shù) " + multiset.elementSet().size());
// 可以統(tǒng)計(jì)每個(gè)元素出現(xiàn)的個(gè)數(shù)
System.out.println("元素a出現(xiàn)的次數(shù) " + a);
----------------------------------
out:
    包含重復(fù)元素的個(gè)數(shù)  3
    不包含重復(fù)元素的個(gè)數(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 則兩個(gè)區(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)

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


4.Table

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

        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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容