Java中ArrayList无内置统计方法,需用HashMap手动统计(推荐)、Collections.frequency()查单元素或Stream API函数式统计,注意equals/hashCode实现及null处理。

Java 中 ArrayList 本身没有内置的“统计元素出现次数”方法,但可以通过几种简洁有效的方式实现。核心思路是:遍历集合,用键值对(如 Map)记录每个元素及其频次。
用 HashMap 手动统计(推荐,通用且高效)
这是最常用、最灵活的方式,适用于任意类型元素(只要重写了 equals() 和 hashCode())。
- 创建一个
HashMap<E, Integer>,键为元素,值为出现次数 - 遍历
ArrayList,对每个元素:若已存在则计数 +1;否则设为 1 - 可使用
merge()或compute()简化逻辑
示例代码:
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "a", "c", "b", "a"));
Map<String, Integer> countMap = new HashMap<>();
for (String s : list) {
countMap.put(s, countMap.getOrDefault(s, 0) + 1);
}
// 结果:{a=3, b=2, c=1}
用 Collections.frequency()(适合单次查询)
如果只是想查某一个**特定元素**在列表中出现了几次,无需统计全部,直接用 Collections.frequency() 最简单。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 底层就是遍历比较,时间复杂度 O(n),适合低频、单次查询场景
- 不适用于频繁或批量统计,否则效率不如 Map 方案
示例:
int countA = Collections.frequency(list, "a"); // 返回 3 int countX = Collections.frequency(list, "x"); // 返回 0
用 Stream API(Java 8+,函数式风格)
一行流式操作即可完成统计,代码简洁,适合喜欢函数式编程的场景。
- 用
stream().collect(Collectors.groupingBy(..., Collectors.counting())) - 注意返回的是
Map<E, Long>,计数值是Long类型 - 性能略低于手动 HashMap(有装箱/函数调用开销),但可读性高
示例:
Map<String, Long> freq = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
注意事项
统计结果是否准确,取决于元素类型的 equals() 和 hashCode() 实现:
- 对
String、包装类(Integer、Boolean等)默认行为正确 - 对自定义对象,必须重写
equals()和hashCode(),否则相同逻辑内容的对象可能被当作不同键处理 - 若元素为
null,HashMap支持作为键(仅一个),Collections.frequency()也支持统计null次数

















