Java不规则二维数组遍历无“高性能写法”,性能关键在于内存访问模式、空值防护、避免固定列长假设及减少边界检查;必须用arr.length控制外层循环,每行先判空再访问arr[i].length,内层循环条件严格为j<arr[i].length。

Java不规则二维数组遍历本身没有“高性能写法”,核心矛盾不在代码结构,而在内存访问模式——它天然不适合列优先或跨行随机访问。真正影响性能的,是是否做了必要的空值防护、是否误用固定列长假设、以及是否在高频场景中反复触发边界检查。优化重点应落在安全前提下的逻辑精简与缓存友好设计上。
空安全是性能底线,不是可选项
未判空就调用 .length 或下标访问,会直接抛 NullPointerException,中断执行;用 arr[0].length 代替 arr[i].length 则大概率触发 ArrayIndexOutOfBoundsException。这些异常开销远超正常循环本身。
- 外层循环必须只依赖
arr.length,这是唯一确定不越界的长度 - 每进入一行前,加
if (arr[i] != null),避免后续所有操作崩溃 - 内层循环条件严格写成
j ,绝不复用其他行的长度
传统 for 循环仍是首选,增强 for 需谨慎
增强 for(for-each)写起来短,但隐藏了索引,且对 null 更敏感:外层变量类型必须是 int[] row : arr,不能是 int x : arr;内层仍需 if (row != null) 才能进 for (int x : row)。
- 需要修改元素、记录行列位置、或做条件跳过时,传统双层 for 更清晰可控
- 纯只读且语义明确(如“打印所有数字”)时,增强 for 可减少笔误,但空检查一步不能少
- 避免混合使用:不要在外层用增强 for、内层用传统 for 并复用变量名,易引发状态污染
列优先遍历:先求最大列宽,再逐列探查
不规则数组没有统一列数,强行按列遍历必须先扫描一遍找最大列长,否则无法定义外层循环上限。
立即学习“Java免费学习笔记(深入)”;
- 第一步:遍历所有非 null 行,计算
maxCols = Math.max(maxCols, row.length) - 第二步:外层循环
for (int col = 0; col - 第三步:内层遍历每行
for (int i = 0; i ,访问前检查 <code>arr[i] != null && col
真正影响性能的,其实是数据组织方式
如果业务长期需按列聚合(如统计每列平均值),硬写列遍历效率低且易错。更优解是重构数据:
- 转置为逻辑列即物理行:把原数组按列拆成新的一维数组集合,后续遍历回归行优先
- 改用一维数组模拟:用
data[row * maxCols + col]存储,列访问改为data[col * maxCols + row],保持内存连续 - 小数据量无需过度优化;大数据量+高频列访问,应优先考虑
java.nio.FloatBuffer或预分配连续缓冲区



















