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 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int[][] arr = {{1, 2}, {3}, {4, 5, 6, 7}};- 每对花括号代表一个独立的一维数组,长度互不影响
- 系统自动推导外层数组长度(这里是 3),并为每行分配对应大小内存
- 这种写法隐式完成所有内层初始化,不会出现
null行
避免常见误操作
这些做法看似省事,实则埋下隐患:
- 写
new int[3][4]后再改某行:这创建的是规则数组,arr[0] = new int[6]只是替换引用,原结构约束已失效,后续若按统一列长遍历会出错 - 声明后未初始化某行就访问:
arr[2]保持null,调用arr[2].length直接报错 - 用
arr[i][j]前不检查arr[i] != null:越界检查不能只做i ,漏掉判空就会触发 NPE 而非 <code>ArrayIndexOutOfBoundsException
推荐初始化习惯
让每行都有明确状态,减少运行时不确定性:
- 逻辑上“无数据”的行,初始化为
new int[0]而非保留null - 批量初始化可用循环 + 条件判断,例如按行索引动态定长:
arr[i] = new int[i * 2 + 1]; - 配合遍历时始终使用
if (arr[i] != null)开头,再用arr[i].length控制内层循环上限
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










