Java数组遍历需兼顾安全性与可读性:空数组和null必须前置校验;增强for适用于只读场景,修改元素需用传统for;索引相关逻辑应避免计数器,直接用传统for;原始类型数组流操作须用Arrays.stream而非Stream.of。

Java 数组遍历本身不复杂,但写法选择直接影响代码是否干净、易懂、不易出错。真正的好代码不是“能跑就行”,而是让别人(包括未来的你)一眼看懂意图,且不容易改出 bug。
空数组与 null 安全处理
遍历前未校验数组状态,是运行时异常的高发源头。尤其在方法参数传入或外部数据解析场景中,array == null 或 array.length == 0 必须显式应对。
- 推荐统一前置检查:if (arr == null || arr.length == 0) { return; } 或抛出自定义业务异常
- 避免在增强 for 中直接使用未判空的引用类型数组(如 String[]),否则空指针会在首行触发
- 工具类调用(如 Arrays.toString(arr))内部已做 null 判定,但返回 "null" 字符串,业务逻辑仍需区分语义
增强 for 循环的只读边界意识
增强 for 表达的是“逐个读取元素”的语义,它天然屏蔽索引,也天然禁止通过循环变量修改原数组内容——这是安全优势,也是常见误用点。
- 写法 for (int x : arr) { x = 100; } 不会改变 arr[i],x 是值副本;若需修改,请切回传统 for
- 对引用类型数组(如 Person[]),可调用对象方法(x.setName("A")),因 x 指向堆中同一实例;但重新赋值(x = new Person())仍无效
- 当逻辑中隐含“第几个元素”需求(如跳过前两个、偶数位处理),强行用增强 for + 计数器会削弱可读性,应换用传统 for
传统 for 循环的索引控制细节
传统 for 是唯一能自然承载索引语义的方式,但越界、边界错位、长度重复读取等低级错误频发,需靠习惯加固。
立即学习“Java免费学习笔记(深入)”;
- 上限写成 i
- 高频或大数组场景下,显式缓存长度:for (int i = 0, len = arr.length; i
- 二维数组遍历时,内层用 arr[i].length 而非 arr[0].length,兼容不规则数组(如 int[][] ragged = {{1}, {2,3,4}})
Stream API 的适用边界提醒
Stream 不是遍历语法糖,而是为函数式数据转换设计的抽象层。把它用于简单打印或累加,反而增加理解成本和运行开销。
- 纯遍历场景(如 forEach(System.out::println))比传统 for 慢 3–5 倍,百万级 int[] 差异明显
- 真正值得用 Stream 的典型模式:过滤+映射+聚合,例如 Arrays.stream(nums).filter(n -> n > 0).mapToInt(x -> x * x).sum()
- 原始类型数组(int[]、long[])必须用 Arrays.stream(arr),不可用 Stream.of(arr),后者会把整个数组当作单个 Object 元素


















