首选传统for循环(需索引或中途跳出)、增强for循环(只读值且非空)、Arrays.stream()(需链式操作);三者依需求选,不盲目追新。

for 循环遍历一维数组的三种写法怎么选
Java 里遍历一维数组,for 循环其实就三条路:传统索引式、增强 for(即 for-each)、以及 Java 8+ 的 Arrays.stream()。选哪个不看“新不新”,而看你要不要索引、要不要中途跳出、数组是不是 null。
- 要访问下标(比如要和相邻元素比较、做下标运算),必须用传统
for (int i = 0; i < arr.length; i++) - 只读取值、不关心位置、且确定数组非空,
for (Type e : arr)最简洁安全 - 需要链式操作(过滤、映射、求和等),才值得上
Arrays.stream(arr);它开销明显更大,别为“看起来高级”滥用
传统 for 循环里 i 不能写成 <code>i <p>看似等价,但后者在 <code>arr 为空数组时会触发 ArrayIndexOutOfBoundsException —— 因为 arr.length - 1 是 -1,i <= -1 初始就不成立?不,问题出在计算本身:如果 arr 是 null,arr.length 就直接抛 NullPointerException,而 i < arr.length 同样会在这里崩,但至少不会多一次算术溢出风险。
更关键的是可读性:i < arr.length 直观表达“不到边界”,而 i <= arr.length - 1 多一层减法,还容易手误写成 i <= arr.length(越界)或漏掉等号(漏最后一个元素)。
增强 for 循环遇到 null 数组直接炸
for (String s : strings) 这行代码,只要 strings 是 null,运行时立刻抛 NullPointerException,连循环体都进不去。这不是语法错误,编译完全通过,所以特别容易漏测。
立即学习“Java免费学习笔记(深入)”;
- 必须在进入循环前判空:
if (strings != null) { for (String s : strings) { ... } } - 如果逻辑允许,把空数组当作空集合处理,比用
new String[0]初始化更省事 - 别指望增强
for自动跳过null—— 它连数组引用都没解引用成功,根本没到“遍历元素”那步
遍历过程中修改数组内容是否安全
传统 for 循环里改数组元素(比如 arr[i] = newValue)完全没问题,这是数组设计的正常使用方式。
但要注意两点:
- 改的是元素值,不是数组长度:Java 数组长度固定,
arr.length不会因赋值改变 - 如果循环逻辑依赖前面修改过的值(比如滚动平均、状态传递),务必确认下标顺序和更新时机,避免用错旧值或新值
增强 for 里也能改元素,但写法绕一点:for (int i = 0; i < arr.length; i++) 更直白,没必要为了“少写个 i”硬套增强循环再额外维护索引
数组本身不可变,但它的元素可变——这个边界得拎清。很多人卡在以为“改了就影响遍历”,其实只是自己逻辑没理顺。










