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());
}