双重循环是遍历规则二维数组最直接、最可控的方式,关键在于安全、清晰、可维护;需用arr[i].length而非arr[0].length防空指针,外层判null、内层用局部变量优化性能。

双重循环是遍历规则二维数组最直接、最可控的方式。关键不在于“会不会写”,而在于写得是否安全、清晰、可维护——尤其当数组存在空行、需提前终止、或要配合索引做逻辑判断时。
外层控行、内层控列:结构必须明确
规则二维数组指每行长度一致(如 new int[4][5]),但即便如此,也不能跳过边界检查。外层循环变量 i 对应行索引,范围是 0 ;内层变量 <code>j 对应列索引,范围是 0 。注意:<strong>不能写成 <code>j ,否则遇到动态初始化未赋值的行(如 arr[2] = null)会直接抛 NullPointerException。
- 始终用
arr[i].length获取当前行长度,既兼容不规则数组,也避免空指针 - 若确定所有行已初始化且等长,可缓存
int cols = arr[0].length提升可读性,但不可替代arr[i].length的安全性 - 空数组(
arr.length == 0)无需额外判空——外层循环自然不执行,安全
遍历时常见操作:求和、查找、修改
双重循环的价值体现在具体任务中。例如求和只需一个累加器;查找目标值需配合标志位跳出双层;修改元素则必须用传统 for(增强 for 中的 int x 是副本,改了无效)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 求和:声明
int sum = 0,循环内执行sum += arr[i][j] - 查找并退出:用布尔标志
found,内层 break 后在外层加if (found) break - 修改对角线元素:仅适用于方阵,条件为
i == j,直接赋值arr[i][j] = 0
性能与可读性的实用权衡
双重 for 循环本身没有性能瓶颈,O(n²) 是问题本质决定的,不是语法缺陷。优化重点在减少冗余计算,而非替换结构。
- 把
arr[i]提前存入局部变量(如int[] row = arr[i]),避免重复取址 - 列长度若固定,可在外层循环内缓存
int len = row.length,减少每次访问字段开销 - 不需要索引时,增强 for 更简洁;需要索引、要修改、或逻辑依赖行列位置时,坚持用传统 for
别忽略 null 行这个隐形陷阱
Java 允许二维数组中某行为 null,比如 int[][] arr = new int[3][] 后只初始化了 arr[0] 和 arr[2]。此时若直接用 arr[i].length 会崩溃。
- 安全写法:外层循环内先判断
if (arr[i] != null),再进入内层循环 - 初始化阶段就补全:创建后显式赋值
arr[i] = new int[cols],比运行时判空更彻底 - 调试时可用
System.out.println(Arrays.toString(arr[i]))快速确认某行是否为空
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










