转载:https://www.cnblogs.com/moongeek/p/12831296.html
Collection | JDK | ImmutableCollection |
List | JDK | ImmutableList |
Set | JDK | ImmutableSet |
SortedSet/NavigableSet | JDK | ImmutableSortedSet |
Map | JDK | ImmutableMap |
SortedMap | JDK | ImmutableSortedMap |
Multiset | Guava | ImmutableMultiset |
SortedMultiset | Guava | ImmutableSortedMultiset |
Multimap | Guava | ImmutableMultimap |
ListMultimap | Guava | ImmutableListMultimap |
SetMultimap | Guava | ImmutableSetMultimap |
BiMap | Guava | ImmutableBiMap |
ClassToInstanceMap | Guava | ImmutableClassToInstanceMap |
Table | Guava | ImmutableTable |
2. Multiset#
定义摘自维基百科:
”集合[set]概念的延伸,它的元素可以重复出现…与集合[set]相同而与元组[tuple]相反的是,Multiset元素的顺序是无关紧要的:Multiset {a, a, b}和{a, b, a}是相等的”
Multiset继承自JDK中的Collection接口,而不是Set接口,所以可以包含重复元素。可以从以下角度理解:
- 没有元素顺序限制的ArrayList
- Map<E, Integer>,键为元素,值为计数
Multiset提供像无序的ArrayList的基本操作:
- add(E)添加单个给定元素
- iterator()返回一个迭代器,包含Multiset的所有元素(包括重复的元素)
- size()返回所有元素的总个数(包括重复的元素)
当把Multiset看作Map<E, Integer>时,它也提供了Map的查询操作:
- count(Object)返回给定元素的计数。
- entrySet()返回Set<Multiset.Entry>,和Map的entrySet类似。
- elementSet()返回所有不重复元素的Set,和Map的keySet()类似。
Multiset<Object> multiset = HashMultiset.create(); multiset.add("A"); multiset.add("A"); multiset.add("A"); multiset.add("B"); multiset.add("B"); multiset.add("C"); int b = multiset.count("B"); System.out.println(b); System.out.println(multiset);
输出:
2
[A x 3, B x 2, C]
3. Multimap#
通俗来讲,Multimap 是一键对多值的HashMap,类似于 Map<K, List> 的数据结构。
主要操作:
- asMap:为Multimap<K, V>提供Map<K,Collection>形式的视图
- entries:返回所有”键-单个值映射”,包括重复键。Collection<Map.Entry<K, V>>类型
- keySet:返回所有不同的键,Set类型
- keys:用Multiset表示Multimap中的所有键,每个键重复出现的次数等于它映射的值的个数。可以从这个Multiset中移除元素,但不能做添加操作;移除操作会反映到底层的Multimap
- values:用一个”扁平”的Collection包含Multimap中的所有值,包括重复键
4. BiMap#
一般的Map只提供”键-值“的映射,而BiMap则同时提供了”键-值“和”值-键“的映射关系。常用方法:
-
put(K key, V value):添加新的键、值。如果值和已有键重复,会抛出异常
-
forcePut(K key, V value):添加新的键、值。如果值和已有键重复,会覆盖原来的键、值
-
inverse():得到”值-键“的BitMap对象
5. Table#
Table类似多个索引的表,类似 Map<R, Map<C, V>> 的数据结构。它有两个支持所有类型的键:”行”和”列”,可以通过以下方法获取多个视图:
- rowMap():用Map<R, Map<C, V>>表现Table<R, C, V>。同样的, rowKeySet()返回”行”的集合Set。
- row(r):用Map<C, V>返回给定”行”的所有列,对这个map进行的写操作也将写入Table中。
- cellSet():用元素类型为Table.Cell的Set表现Table<R, C, V>。Cell类似于Map.Entry,但它是用行和列两个键区分的。
Table<Object, Object, Object> table = HashBasedTable.create(); table.put("1", "A", 2); table.put("1", "B", 1); table.put("2", "B", 3); System.out.println(table.row("1")); System.out.println(table.column("B")); System.out.println(table);
输出:
{A=2, B=1} {1=1, 2=3} {1={A=2, B=1}, 2={B=3}}