java高效统计数组元素频率推荐用hashmap手动遍历(o(n),通用清晰),或intstream+groupingby(仅限基本类型,有装箱开销),或计数数组(非负整数范围有限时最快);避免嵌套循环、重复流操作等低效方式。

Java 中高效统计数组元素频率,核心是用 HashMap(或 IntStream + Collectors.groupingBy 适合基本类型包装),避免嵌套循环暴力计数。关键在于时间复杂度控制在 O(n),同时兼顾可读性与内存开销。
用 HashMap 手动遍历(通用、清晰、推荐)
适用于任意类型数组(包括自定义对象,需保证 equals() 和 hashCode() 正确)。遍历一次,边读边累加:
- 创建
Map<t integer></t>,键为元素,值为出现次数 - 对每个元素:用
map.merge(element, 1, Integer::sum)最简洁;或先getOrDefault再put - 整型数组示例:
int[] arr = {1,2,2,3,3,3};→Map<integer integer> freq = new HashMap();</integer>,循环中freq.merge(x, 1, Integer::sum);
用 IntStream + groupingBy(仅限 int/long/double,函数式风格)
适合原始整型数组,代码短但隐含装箱开销。注意:Arrays.stream(arr) 对 int[] 返回的是 IntStream,需先转为 Integer 流:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Map<integer long> freq = Arrays.stream(arr).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));</integer>- 返回值是
Long计数,如需Integer可改用Collectors.summingInt(e -> 1) - 不推荐用于大数组(频繁装箱影响性能),小数据量写起来更紧凑
针对纯正整数且范围有限的场景:用计数数组(最快,O(1) 查找)
当元素都是非负整数,且最大值已知且不太大(比如 0~10000),直接用索引当键:
- 申请
int[] count = new int[maxValue + 1]; - 遍历原数组:对每个
x,执行count[x]++ - 无需哈希计算,无装箱,内存局部性好,速度最快
- 缺点:不支持负数、字符串、大范围或稀疏数据(比如元素是 1 和 999999,浪费大量空间)
避免常见低效写法
以下方式应尽量避开:
- 双重 for 循环逐个统计:时间复杂度 O(n²),n > 10⁴ 就明显变慢
- 每次调用
Arrays.asList(arr).stream().filter(...).count():反复创建流和中间集合,开销巨大 - 用 ArrayList 存所有相同元素再取 size():内存占用高,且没利用哈希查找优势
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










