Java数组遍历需按需求选方式:需索引用传统for循环,只读用增强for,链式处理用Stream;注意基本类型数组须用Arrays.stream()而非Stream.of(),并规避整数除法、空数组、最大最小值初始化等常见坑。

Java 数组遍历不是单纯“把每个数打出来”,而是根据实际需求选择合适方式,兼顾可读性、安全性与性能。用错方法容易出越界异常、装箱开销或逻辑漏洞,尤其在统计、筛选、转换类任务中。
三种主流遍历方式怎么选
不是所有场景都适合用同一种写法:
-
需要索引时(比如修改元素、前后对比、按位置处理)→ 用传统 for 循环:能直接访问
i,也方便做边界判断和下标运算 - 只读取元素、逻辑简单 → 优先用增强 for(for-each):代码干净,不易越界,但无法获取当前下标,也不能在遍历时修改原数组结构
-
要链式处理(过滤+映射+聚合)→ 上 Stream:比如“找出所有及格分数、转成字符串、拼成逗号列表”,一行就能表达,且天然支持并行(
parallelStream())
基本类型数组用 Stream 要特别注意
别直接对 int[] 调用 .stream()——它没有这个方法。必须用 Arrays.stream(nums),返回的是 IntStream,不是 Stream<Integer>:
- 这样写是高效且推荐的:
Arrays.stream(scores).filter(s -> s >= 60).average().orElse(0.0) - 如果误写成
Stream.of(scores),实际得到的是Stream<int[]>(整个数组当一个元素),结果完全不对 - 想转成对象流再操作?用
Arrays.stream(scores).boxed(),但会带来装箱开销,大数据量时慎用
数据处理常见坑与应对
遍历只是手段,真正容易翻车的是后续处理逻辑:
立即学习“Java免费学习笔记(深入)”;
-
求平均值时整数除法陷阱:
sum / arr.length结果是 int 截断,应写成(double) sum / arr.length或用IntStream.average() -
找最大/最小值不能默认设 0 或 Integer.MAX_VALUE:数组全为负数时会失效,稳妥做法是用第一个元素初始化,或用
Stream.max(Comparator.naturalOrder()) -
空数组要提前检查:调用
arr[0]或Arrays.stream(arr).findFirst()前,先判断arr.length == 0,否则抛异常 -
打印数组别直接
System.out.println(arr):输出的是内存地址,要用Arrays.toString(arr)或Arrays.deepToString()(对二维数组)
二维数组遍历不等于套两层 for
一维数组的遍历经验不能简单平移:
- 外层循环控制行数,内层控制列数,但每行长度可能不同(不规则二维数组),所以内层条件应是
j < matrix[i].length,而非固定matrix[0].length - 用增强 for 处理二维数组更清晰:
for (int[] row : matrix) { for (int val : row) { ... } } - Stream 处理二维数组需先扁平化:
Arrays.stream(matrix).flatMapToInt(Arrays::stream),才能统一过滤或求和


















