传统for循环是唯一能直接获取下标的方式,适用于需索引或修改元素的场景,如偶数下标翻倍、双指针反转、反向遍历等。

Java 一维数组遍历没有“最优解”,只有“最合适”。选哪种方式,取决于你当前要做什么——是改元素、要下标、只读取,还是仅仅想快速看看内容。
需要索引或修改数组元素?用传统 for 循环
这是唯一能直接拿到下标的写法,适用所有需位置信息的场景。
- 修改原数组:比如把偶数下标的值翻倍,arr[i] = arr[i] * 2;
- 双指针操作:如反转数组、找两数之和,必须靠 i 和 j 控制两端
- 反向遍历:从 arr.length - 1 往回走,传统 for 写起来最自然
- 边界注意:i 是安全写法;别用 i ,易手误、难维护
只读遍历、代码求简洁?增强 for 循环更合适
它不暴露索引,语义干净:“对每个元素做某事”,天然规避越界风险。
- 打印、累加、校验、转字符串等纯消费操作,一行搞定:for (int x : arr) { sum += x; }
- 不会因 i++ 或条件写错导致
ArrayIndexOutOfBoundsException - 但要注意:数组引用为 null 时会直接抛 NullPointerException,使用前得判空:if (arr != null)
- 不能在循环体里改变数组长度(本来也不能),但可以改元素值——只是不如传统 for 直观
其他方式:按需选用,不强行替代
不是所有遍历都得套 for,有些场景换种思路更高效。
- Arrays.toString(arr):只用于调试或日志输出,一行打印整个数组,不用于逻辑处理
- while / do-while:适合配合外部状态控制的遍历(如读文件流、用户输入终止),但日常数组遍历没必要
- Arrays.stream(arr):需要过滤、映射、聚合等链式操作时才用,开销比 for 大,别为“写得像函数式”而滥用
性能误区:别在语法上较真
传统 for 和增强 for 在遍历一维数组时,JVM 编译出的字节码几乎一样,JIT 还会做边界检查消除。真正拖慢速度的,从来不是循环写法本身。
- 循环体内创建对象、调用 I/O(如 System.out.println())——这部分耗时远超循环控制
- 大数组但访问不连续(如 i += 3)——影响 CPU 缓存命中率,和 for 类型无关
- 代码未被 JIT 编译(刚启动阶段)——两种写法都慢,差异仍可忽略
不复杂但容易忽略:写出清晰、正确、易维护的遍历逻辑,比纠结哪条 for 每次快 0.3 纳秒重要得多。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











