发布于2026-07-07 阅读(0)
扫一扫,手机访问
说到统计Ja va数组元素频率,很多人第一反应就是双重循环暴力计数——但那样效率太低了。实际上,有几种高效方案:HashMap手动遍历(O(n),通用清晰)、IntStream + groupingBy(适合基本类型,有装箱开销),或者计数数组(非负整数且范围有限时性能直接拉满)。记住一条铁律:避免嵌套循环、重复流操作,那是给自己挖坑。

那么具体怎么选?核心原则很简单:时间复杂度控制在 O(n),同时兼顾可读性和内存开销。下面逐一拆解。
这个方法适用于任意类型数组,包括自定义对象(前提是保证 equals() 和 hashCode() 正确实现)。遍历一次,边读边累加:
Map,键为元素,值为出现次数。map.merge(element, 1, Integer::sum) 最简洁;或用 getOrDefault 再 put 也行。int[] arr = {1,2,2,3,3,3}; → Map freq = new HashMap<>(); ,循环中 freq.merge(x, 1, Integer::sum); 一步到位。如果你偏爱函数式写法,可以用 Stream 来实现。但注意隐含的装箱开销:Arrays.stream(arr) 对 int[] 返回的是 IntStream,必须调用 .boxed() 才能转为 Integer 流:
Map freq = Arrays.stream(arr).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); Long 计数,如果你非要 Integer,可以换成 Collectors.summingInt(e -> 1)。当元素都是非负整数,且最大值已知且不太大(比如 0~10000),直接用数组索引当键:
int[] count = new int[maxValue + 1];x,执行 count[x]++。以下写法尽量避开:
Arrays.asList(arr).stream().filter(...).count():反复创建流和中间集合,开销巨大。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8