最常用、简洁且高效的方式是使用 HashMap 统计:遍历 ArrayList,用 getOrDefault 更新频次,时间复杂度 O(n),支持任意重写 equals 和 hashCode 的类型。

Java 中统计 ArrayList 里重复元素的出现次数,最常用、简洁且高效的方式是使用 HashMap(或 Map<E, Integer>)来记录每个元素及其频次。
用 HashMap 遍历统计(推荐)
遍历一次列表,对每个元素:若 Map 中已存在,值 +1;否则初始化为 1。
- 适用于任意类型元素(只要重写了
equals()和hashCode(),如 String、Integer、自定义类) - 时间复杂度 O(n),空间复杂度 O(唯一元素个数)
- 代码清晰,无第三方依赖
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}
用 Java 8 Stream API(函数式风格)
适合喜欢链式调用、代码更紧凑的场景,底层仍是基于 Map 统计。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 调用
Collectors.groupingBy()+Collectors.counting() - 返回
Map<E, Long>,注意计数值是Long类型 - 不可修改原集合,纯函数式,线程安全(无副作用)
Map<String, Long> countMap = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
只关心某个特定元素的出现次数
如果只需查一个元素(比如 “a” 出现几次),不用全量统计,更轻量:
立即学习“Java免费学习笔记(深入)”;
- 用
Collections.frequency(list, target)—— 简单直接,内部就是遍历计数 - Stream 写法:
(int) list.stream().filter(e -> e.equals(target)).count()
注意事项
自定义对象作为元素时,必须正确重写 equals() 和 hashCode(),否则 HashMap 或 frequency 方法会把逻辑相等的对象当成不同元素处理。
- 例如:两个
Person("Alice", 25)对象,若没重写 equals/hashCode,即使字段相同也会被当作不同 key - 推荐用 IDE 自动生成(如 IntelliJ 的 Alt+Insert → “equals and hashCode”)

















