选遍历方式核心看三点:要不要索引、改不改元素、做不做复杂处理;需索引或修改数组用传统for循环,只读遍历用增强for,复杂数据处理用stream,其他场景按需选用while、arrays工具类等。

选遍历方式,核心看三点:要不要索引、改不改元素、做不做复杂处理。性能只是结果,不是出发点。
需要索引或修改数组时,用传统 for 循环
这是唯一能自然拿到下标、边遍历边改原数组内容的方式。比如查找最大值位置、替换负数、倒序复制等场景都离不开它。
- 写法上建议缓存长度:for (int i = 0, len = arr.length; i ,避免每次循环都读一次 length 字段(虽 JVM 常优化,但显式缓存更稳)
- 支持反向遍历:for (int i = arr.length - 1; i >= 0; i--),适合栈式操作或避免正向修改影响后续逻辑
- 二维数组务必用行优先:for (int i = 0; i ,否则缓存命中率骤降,实测可能慢 4–7 倍
只读遍历且不关心位置,增强 for 最合适
代码干净、不易越界、语义明确——“我只要每个值”。编译后底层仍是索引访问,性能和传统 for 几乎一致。
- 注意变量是副本:for (int x : arr) { x = 100; } 不会影响 arr[i],真要改得靠传统 for 或 Arrays.fill
- 不能直接跳出多层循环,如需提前终止并带状态,可封装成方法返回,或加标签(较少见)
- 兼容所有数组类型,包括 int[]、String[]、自定义对象数组,无需额外转换
要做过滤、映射、聚合,再考虑 Stream
Stream 不是遍历工具,而是数据处理管道。仅用来打印或累加?传统 for 更快;要取偶数平方和、去重转 List、并行求平均?它才真正发挥价值。
- 原始类型数组必须用 Arrays.stream(arr),别用 Stream.of(arr),后者会把整个数组当一个元素
- 百万级数据简单遍历,Stream 通常比传统 for 慢 3–5 倍,GC 压力略高,开销来自 Stream 对象创建、装箱拆箱、内部链路调度
- 若需并行处理大数据量(如计算密集型),可用 Arrays.stream(arr).parallel(),但要注意线程安全和副作用
其他方式按需补充
while 和 do-while 适合控制逻辑复杂、依赖外部状态或必须至少执行一次的场景;Arrays 工具类(如 toString、fill、sort、equals)则用于替代手写循环完成批量操作,不属“遍历”但常配合使用。
- 调试时打印数组内容,直接用 Arrays.toString(arr),别 System.out.println(arr)
- 全数组赋值统一值,用 Arrays.fill(arr, 99),比 for 循环更简洁且语义清晰
- 判断两个数组是否相等,用 Arrays.equals(a, b),它内部就是逐个比较,但已高度优化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











