增强for循环累加数组需显式初始化sum=0,避免声明在循环内;int[]用Arrays.stream(arr).sum()正确,Integer[]需mapToInt;多维数组须flatMapToInt或嵌套增强for;溢出均静默发生,需手动防护。

用增强for循环累加数组,别漏掉初始化
增强for循环本身不提供索引或累加能力,sum变量必须显式声明并初始化为 0,否则编译报错或结果不可控。常见错误是把 sum 声明在循环内部,导致每次迭代都重置。
- 写法必须是:
int sum = 0; for (int x : arr) { sum += x; } - 如果数组为空,
sum仍为0,行为确定,无需额外判空 - 注意类型匹配:
long数组要用long sum = 0L,否则可能溢出且无警告 - 性能上几乎无开销,JVM 通常能内联优化,适合小到中等规模数组
Stream API 的 sum() 要求包装类型或用 mapToInt
int[] 是原始类型数组,不能直接调用 Arrays.stream(arr).sum()——这会返回 Stream<int></int>,编译失败。必须转成数值流才能用 sum()。
- 正确写法:
Arrays.stream(arr).sum()✅(arr是int[]) - 但如果是
Integer[],得先用mapToInt(Integer::intValue),否则sum()不可用 - 空数组时
sum()返回0,和增强for一致;但若用reduce且没给 identity,空流会返回Optional.empty() - 启动开销略高,短数组反而比增强for慢;大量数据且已有 Stream 链路时才显优势
遇到负数、大整数或溢出时,sum() 和增强for一样静默失败
Java 所有整数累加操作都不检查溢出,int 加到 2147483647 再加 1 会变成 -2147483648,sum() 和手写循环表现完全一致,不会抛异常也不会告警。
- 需要防溢出?改用
long类型累加,或用Math.addExact()主动捕获ArithmeticException -
IntStream.sum()没有溢出检查版本;如需安全累加,只能自己写循环 +addExact - 第三方库如 Guava 的
LongMath.checkedAdd()可用,但引入依赖要权衡
多维数组不能直接用 Arrays.stream().sum()
int[][] arr2d 调用 Arrays.stream(arr2d) 得到的是 Stream<int></int>,sum() 方法根本不存在,编译报错:Cannot resolve method 'sum()' in 'Stream'。
立即学习“Java免费学习笔记(深入)”;
- 正确解法:先 flatMap,例如
Arrays.stream(arr2d).flatMapToInt(Arrays::stream).sum() - 或者用嵌套增强for:
for (int[] row : arr2d) for (int x : row) sum += x; - 注意
flatMapToInt会触发装箱/拆箱和对象创建,大数据量时 GC 压力比双重循环大










