最常用方式是使用Hashmap和stream API。1. 手动遍历集合,利用HashMap的getOrDefault方法统计元素频次;2. 使用Java 8 Stream API的Collectors.groupingBy和Collectors.counting()进行简洁统计;3. 小规模场景可用Collections.frequency()结合去重集合遍历统计,但效率较低;4. 第三方库guava的Multiset适合频次统计,提供更专业的API。推荐使用Stream API方法,代码简洁、可读性强且效率高。

在Java中统计集合中不同元素的出现频率,最常用的方式是使用 HashMap 来记录每个元素及其对应的频次。下面介绍几种常见的实现方法。
1. 使用 HashMap 手动统计
遍历集合,对每个元素判断是否已存在于Map中,存在则计数加1,否则初始化为1。
- List<String> list = Arrays.asList(“apple”, “banana”, “apple“, “orange”, “banana”, “apple”);
- Map<String, Integer> frequency = new HashMap<>();
- for (String item : list) {
- frequency.put(item, frequency.getOrDefault(item, 0) + 1);
- }
- System.out.println(frequency); // 输出: {orange=1, banana=2, apple=3}
2. 使用 Java 8 Stream API
利用 Collectors.groupingBy 和 Collectors.counting() 可以简洁地完成频率统计。
- Map<String, Long> frequency = list.stream()
- .collect(Collectors.groupingBy(function.identity(), Collectors.counting()));
- System.out.println(frequency); // 输出: {orange=1, banana=2, apple=3}
3. 使用 Collections.frequency()(适用于小规模场景)
如果集合不大,也可以结合 Collections.frequency() 配合去重后的元素来统计:
立即学习“Java免费学习笔记(深入)”;
- Set<String> uniqueItems = new HashSet<>(list);
- Map<String, Integer> frequency = new HashMap<>();
- for (String item : uniqueItems) {
- frequency.put(item, Collections.frequency(list, item));
- }
这种方式代码直观,但对大集合效率较低,因为每次调用 frequency 都要遍历整个列表。
4. 使用第三方库(如 Guava)
Guava 提供了 Multiset,专门用于处理元素频次问题:
- Multiset<String> multiset = HashMultiset.create(list);
- Map<String, Integer> frequency = new HashMap<>();
- for (String item : multiset.elementSet()) {
- frequency.put(item, multiset.count(item));
- }
基本上就这些常见方式。日常开发推荐使用 Stream API 方法,简洁高效,代码可读性强。


