Java不规则二维数组本质是“数组的数组”,外层数组仅存引用,每行需显式分配内存;初始化须先创建外层(如int[][] arr = new int[4][]),再逐行为内层new空间,或用静态初始化{{1,2},{3},{4,5,6,7}}一步完成。

Java 中不规则二维数组本质是“数组的数组”,外层数组(int[][])只负责存引用,每行是否分配内存、分配多大,必须显式控制。初始化的核心不是一次性搞定,而是逐行按需分配——否则会出现 NullPointerException 或逻辑错乱。
先分配外层,再逐行为内层申请空间
声明和外层创建只需指定行数,第二维留空:
-
int[][] arr = new int[4][];—— 创建含 4 个null元素的外层数组 - 此时
arr[0]到arr[3]全为null,任何arr[i][j]访问都会抛空指针 - 必须对每一行单独执行
new操作,例如:arr[0] = new int[2];// 第 0 行 2 个元素arr[1] = new int[5];// 第 1 行 5 个元素arr[2] = new int[0];// 空行,但非 null,arr[2].length安全可读
用静态初始化一步到位(适合已知全部数据)
如果所有元素值在编译期就确定,直接用大括号嵌套赋值最简洁:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
int[][] arr = {{1, 2}, {3}, {4, 5, 6, 7}};- 每对花括号代表一个独立的一维数组,长度互不影响
- 系统自动推导外层数组长度(这里是 3),并为每行分配对应大小内存
- 这种写法隐式完成所有内层初始化,不会出现
null行
避免常见误操作
这些做法看似省事,实则埋下隐患:
立即学习“Java免费学习笔记(深入)”;
- 写
new int[3][4]后再改某行:这创建的是规则数组,arr[0] = new int[6]只是替换引用,原结构约束已失效,后续若按统一列长遍历会出错 - 声明后未初始化某行就访问:
arr[2]保持null,调用arr[2].length直接报错 - 用
arr[i][j]前不检查arr[i] != null:越界检查不能只做i < arr.length && j < arr[i].length,漏掉判空就会触发 NPE 而非ArrayIndexOutOfBoundsException
推荐初始化习惯
让每行都有明确状态,减少运行时不确定性:
- 逻辑上“无数据”的行,初始化为
new int[0]而非保留null - 批量初始化可用循环 + 条件判断,例如按行索引动态定长:
arr[i] = new int[i * 2 + 1]; - 配合遍历时始终使用
if (arr[i] != null)开头,再用arr[i].length控制内层循环上限

















