Guava存在的价值
引入了很多JDK没有的,但明显有用的新集合类型。这些信类型是为了和JDK集合并存,而没有往JDK集合抽象中硬塞其他概念
新集合的方法Mulitiset与JDK集合方法区别
JDK集合:
set是无序并且元素不能重复的集合
list是有序并且元素可以重复的集合
Guava:
Mulitiset是无序的并且可以重复,区别于set也区别于list,但拥有他们的共性。
怎么看待Mulitiset
以ArrayList 视角来看待
- 看做没有元素顺序限制的ArrayList
- add(e)添加单个给定元素
- iterator()返回一个迭代器,包含Mulitiset所有元素(包括重复元素)
- size返回所有元素的总个数(包含重复元素)
以Map视角来看待
- Map<E,Integer>,键为元素,值为计数
- count(Object) 返回给定元素的计数
- entrySet 返回Set<Mulitiset.Entry>,和Map的entrySet类似
- elementSet反馈所有不重复元素的Set,和Map的keySet类似
Mulitiset与Map的区别
- 元素计数只能是正数
- mulitiset.size返回集合大小
- mulitiset.iterator会迭代重复元素
- mulitiset支持直接设置元素的计数
- 没有的元素mulitiset.count(e)为0,但是Map方法会反馈个null
Mulitiset如何实现
- HashMultiset
- TreeMultiset
- LinkedHashMultiset
- ConcurrentHashMulitiset
- Immutableulitiset
Mulitiset实战案例
使用Mulitiset集合类,实现统计一篇文章中文字出现次数功能
public class MultisetTest {
private static final String text =
"《南陵别儿童入京》" +
"白酒新熟山中归,黄鸡啄黍秋正肥。" +
"呼童烹鸡酌白酒,儿女嬉笑牵人衣。" +
"高歌取醉欲自慰,起舞落日争光辉。" +
"游说万乘苦不早,著鞭跨马涉远道。" +
"会稽愚妇轻买臣,余亦辞家西入秦。" +
"仰天大笑出门去,我辈岂是蓬蒿人。";
@Test
public void handle() {
// multiset创建
Multiset<Character> multiset =
HashMultiset.create();
// string 转换成 char 数组
char[] chars = text.toCharArray();
// 遍历数组,添加到multiset中
Chars.asList(chars)
.stream()
.forEach(charItem -> {
multiset.add(charItem);
});
System.out.println
("size : " + multiset.size());
System.out.println
("count : " + multiset.count('人'));
}
}
运行结果