数组多分组统计:单次遍历多条件VS多次遍历单条件,哪种效率更高?
嘿,针对你要统计1000个int数组里各类子群体(偶数、奇数、大于500的元素等)数量的需求,我给你拆解下两种常用实现方案的细节,帮你根据场景选最合适的~
方案一:传统循环+多条件判断
这个方案的核心思路是一次遍历搞定所有统计:只走一遍数组,对每个元素同时检查所有需要统计的条件,符合哪个就给对应计数器加1。
示例代码如下:
int[] someArray = new int[1000]; // 假设数组已经初始化填充数据 int evenCount = 0; int oddCount = 0; int over500Count = 0; for (int i = 0; i < someArray.length; i++) { int num = someArray[i]; if (num % 2 == 0) { evenCount++; } else { oddCount++; } if (num > 500) { over500Count++; } // 可以继续添加更多条件判断 }
优缺点分析
- 👍 优点:性能拉满,只遍历数组一次,内存开销极低,适合大规模数组的统计场景
- 👎 缺点:如果需要统计的条件越来越多,代码会变得臃肿,可读性和可维护性下降,新增条件得在循环里加if,容易出错
方案二:惰性流处理(Lazy Evaluation)
这个方案利用Java Stream的惰性特性,通过Supplier包装流对象,每次需要统计某类群体时,才触发一次流的遍历(因为Stream只有遇到终端操作时才会执行)。这样每个统计逻辑都是独立的,代码更清爽。
示例代码如下:
int[] someArray = new int[1000]; // 假设数组已经初始化填充数据 // 用Supplier包装流,每次get()都会生成一个新的流实例 Supplier<IntStream> streamSupplier = () -> Arrays.stream(someArray); // 分别统计各类群体,每次调用get()都会遍历一次数组 long evenCount = streamSupplier.get().filter(n -> n % 2 == 0).count(); long oddCount = streamSupplier.get().filter(n -> n % 2 != 0).count(); long over500Count = streamSupplier.get().filter(n -> n > 500).count();
优缺点分析
- 👍 优点:代码模块化、可读性强,新增统计条件只需要加一行
streamSupplier.get().filter(xxx).count(),维护成本低 - 👎 缺点:每个统计都会遍历一次数组,对于超大规模数组(比如百万级以上),性能会比方案一差;不过你这里是1000个元素,完全不用担心性能问题
选择建议
- 如果你的统计条件很少,或者追求极致性能,选方案一
- 如果统计条件经常变动,看重代码的整洁性和可维护性,选方案二(1000个元素的规模下,多次遍历的性能损耗几乎可以忽略)
内容的提问来源于stack exchange,提问作者tdct
相关产品推荐
相关产品推荐

