Google guava新集合类型汇总整理

原文链接:

1.使用说明

Guava中新定义的集合类型有以下的几种:

1.1 Multiset

首先是Multiset,讲道理set里边是没有重复元素的,但是这个东西却能存储重复的元素,查看源码,我们发现此接口也是直接继承自Collection接口,也就是说这个玩意其实和Set压根没有什么关系,但是
它有一个比较有用的功能,就是它能够统计每一个元素的出现频数,具体的例子如下:
示例代码:

public static void main(String[] args) {
       String str="a,b,a,c,d,f,g,r,t,a,s,v,c,x";
       String[] words=str.split(",");
       List<String> list=new ArrayList<String>();
       for (String word : words) {
           list.add(word);
       }

       Multiset<String> multiSet = HashMultiset.create();
       multiSet.addAll(list);

       for(String key:multiSet.elementSet()){
           System.out.println(key+" count:"+multiSet.count(key));
       }
}
1.2 SortedMultiset

顾名思义,这个工具类就是添加了排序的功能,实现这个接口的类主要有以下的几种:

ForwardingSortedMultiset, ForwardingSortedMultiset.StandardDescendingMultiset, ImmutableSortedMultiset, TreeMultiset
示例代码:
具体的使用方式如下:

public static void main(String[] args) {
       String str = "a,b,a,c,d,f,g,r,t,a,s,v,c,x";
       String[] words = str.split(",");
       List<String> list = new ArrayList<String>();
       for (String word : words) {
           list.add(word);
       }
       SortedMultiset<String> sortedMultiset = TreeMultiset.create();

       sortedMultiset.addAll(list);

       for (String s : sortedMultiset) {
           System.out.printf("%s", s);
       }

       for(String key:sortedMultiset.elementSet()){
           System.out.println(key+" count:"+sortedMultiset.count(key));
       }

   }
1.3 Multimap

jdk自带的map只允许一个key对应一个value,而guava中提供了Multimap这个工具类来应对一个key对应多个value的情况,有点类似于redis中的list数据结构,实现这个接口的类主要有以下的几种:

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap
示例代码:

public static void main(String[] args) {
  Multimap<String,String> multiMap= TreeMultimap.create();
  multiMap.put("k1","v1");
  multiMap.put("k1","v2");
  multiMap.put("k2","v3");
  multiMap.put("k3","v4");
  multiMap.put("k0","v0");
  for (String s : multiMap.keySet()) {
      Collection<String> lastNames = multiMap.get(s);
      System.out.println(lastNames);
  }
}
1.4 ListMultimap

相对于Multimap,这个类主要拥有保序的功能,实现这个接口的类主要包括以下的几种:
ArrayListMultimap, ForwardingListMultimap, ImmutableListMultimap, LinkedListMultimap
示例代码:

public static void main(String[] args) {
        ListMultimap<String,String> multiMap= ArrayListMultimap.create();
        multiMap.put("k1","v1");
        multiMap.put("k1","v2");
        multiMap.put("k2","v3");
        multiMap.put("k3","v4");
        for (String s : multiMap.keySet()) {
            Collection<String> lastNames = multiMap.get(s);
            System.out.println(lastNames);
        }

    }
1.5 SetMultimap

实现这个接口的的类主要包含以下的几种:
ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableSetMultimap, LinkedHashMultimap, TreeMultimap
相对于ListMultimap,这个集合类主要功能是实现map里的元素去重,这里的相同指的是key和value均为同一个对象的情况,这边倒是符合了set的特性。
示例代码:

public static void main(String[] args) {
        SetMultimap<String, String> multiMap = HashMultimap.create();
        multiMap.put("k1","v1");
        multiMap.put("k1","v2");
        multiMap.put("k2","v3");
        multiMap.put("k3","v4");
        for (String s : multiMap.keySet()) {
            Collection<String> lastNames = multiMap.get(s);
            System.out.println(lastNames);
        }
    }
1.6 BiMap

实现这个接口的类主要包括下面的几种:
EnumBiMap, EnumHashBiMap, HashBiMap, ImmutableBiMap
对比前面的几种map,这个集合类的主要特性是实现key以及value的翻转,可就是说,这个map既能够进行正排索引也能够进行倒排索引。

示例代码:

public static void main(String[] args) {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("A","a");
        biMap.forcePut("F","a");
        biMap.put("B","b");
        biMap.put("C","c");
        biMap.put("D","d");
        biMap.put("E","e");
        System.out.println(biMap);
        BiMap<String,String> reBiMap = biMap.inverse();
        System.out.println(reBiMap);
    }

值得注意的是biMap不支持key相同,value不同或者key不同value相同的情况,当然可以通过forcePut方法来插入类似的数据,但是key以及value只会存储最后插入的值。

1.7 ClassToInstanceMap

用于存储类类型以及这个类型对应的实例,实现这个接口的类主要包括下面的几种:
ImmutableClassToInstanceMap, MutableClassToInstanceMap

示例代码:

public static void main(String[] args) {
      ClassToInstanceMap classToInstanceMap = MutableClassToInstanceMap.create();
      classToInstanceMap.put(Cat.class,new Cat(1,2));
      System.out.println(classToInstanceMap);
  }
1.8 Table

顾名思义,table就是一张数据表,类似于Map<String,Map<String,String>>这种结构,
实现这个接口的类主要包括下面的几种:
ArrayTable, ForwardingTable, HashBasedTable, ImmutableTable, TreeBasedTable

public static void main(String[] args) {
        Table<String,String,String> table= HashBasedTable.create();
        table.put("book","Java coding","Thinking in  Java");
        table.put("book","C++ coding","Thinking in  C++");
        table.put("book","PY coding","Thinking in  PY");
        table.put("book","GO coding","Thinking in  GO");
        table.put("book","C coding","Thinking in  C");

        table.put("book","car cooking","cook in  car");
        table.put("book","toilet cooking","cook in  toilet");
        table.put("book","sacrificial altar cooking","cook on the sacrificial altar");
        System.out.println(table.columnKeySet());
        System.out.println(table.cellSet());
        System.out.println(table.rowKeySet());
        System.out.println(table.values());
        System.out.println(table.rowMap());
        System.out.println(table.columnMap());
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值