Multiset
Guava提供了一个新集合类型 Multiset,它可以多次添加相等的元素。类似:Map<String, Integer>
举个例子:
1 | final String[] names = new String[] { "nick", "davide", "ken", "ken", "nick", "nick" }; |
HashMap 在实现key值出现次数的统计时,必须拿到原来的值,并重新赋值会原来的集合。还需要判断当前key是否贼map中。
使用 HashMultiset ,我们不需要判断key是否已经存在于集合,也不用自己做值的累加。节省了代码量并且看着非常的直观。
guava为我们提供了如下Multiset类型集合:
map类型 | multiset实现 | 是否支持null | 是否线程安全 | 含义 |
---|---|---|---|---|
HashMap | HashMultiset | Y | N | hash表map |
TreeMap | TreeMultiset | Y | N | 具有排序的map |
LinkedHashMap | LinkedHashMultiset | Y | N | 链表方式实现的map |
ConcurrentHashMap | ConcurrentHashMultiset | N | Y | 线程安全的hash 表map |
ImmutableMap(guava) | ImmutableMultiset | N | Y | 不可变集合 |
Multimap
我们经常使用Map<K, List<V>>或Map<K, Set<V>>,写业务代码,这个结构非常的笨拙。guava提供了,multimap已便我们用来实现业务。
存储的数据结构类似于:
a -> [1, 2, 4] b -> 3 c -> 5
举个例子:
1 | System.out.println("hashMap:"); |
我们可以看出区别,HashMultimap<String, Integer> 其实类似于,HashMap<String,Set<Integer>>的数据结构。
guava为我们提供了如下MultiMap类型集合:
实现 | 键行为类似 | 值行为类似 | 是否可为null | 是否线程安全 | 含义 |
---|---|---|---|---|---|
ArrayListMultimap | HashMap | ArrayList | Y | N | hash表map |
HashMultimap | HashMap | HashSet | Y | N | hash表map |
LinkedListMultimap | LinkedHashMap | LinkedList | Y | N | 链表方式实现的map |
LinkedHashMultimap | LinkedHashMap | LinkedHashMap | Y | N | 链表方式实现的map |
TreeMultimap | TreeMap | TreeSet | Y | N | 具有排序的map |
ImmutableListMultimap | ImmutableMap(guava) | ImmutableList | N | Y | 不可变集合 |
ImmutableSetMultimap | ImmutableMap(guava) | ImmutableSet | N | Y | 不可变集合 |