java中只有“数组的数组”,赋值是引用操作;规则二维数组每行长度固定,不规则需逐行初始化,子数组长度不可变,只能替换引用,静态初始化需避免语法冲突,访问时须动态获取每行长度。

Java 中没有真正意义上的“多维数组”,只有“数组的数组”。赋值行为本质上是引用操作,不是内存扩容或结构修改——这点决定了几乎所有规则和限制的根源。
赋值必须基于已分配的内存空间
声明后不能直接赋值元素,必须先为每一层分配内存:
-
规则二维数组:如
int[][] arr = new int[3][4],外层3个元素、每行固定4个位置,此时可直接写arr[1][2] = 5 -
不规则二维数组:如
int[][] arr = new int[3][],只分配了长度为3的外层数组,每个元素仍是null;必须逐行初始化,例如arr[0] = new int[2]后,才能写arr[0][1] = 8 - 若跳过某行初始化(如没给
arr[2]赋值),后续访问arr[2][0]或arr[2].length会抛出NullPointerException
子数组长度不可动态“改变”,只能替换引用
看似“修改长度”的操作,实际是让某一行指向一个全新数组:
- 写
arr[0] = new int[5],只是把arr[0]原来的引用(比如指向一个长度为3的数组)替换成新数组的引用 - 原数组不会被修改,也不会自动扩容;它只是失去引用,等待垃圾回收
- 常见陷阱:代码假设所有行长度一致(如用
arr[0].length当统一列数),但某行被重新赋值为不同长度后,循环就会出错
静态初始化时长度由大括号内容决定,不可混搭空与非空
用大括号一次性初始化时,编译器按嵌套结构推导维度和长度:
- 合法:
int[][] jagged = {{1, 2}, {3, 4, 5}, {6}};→ 外层长度3,各行长度分别为2、3、1 - 合法但需谨慎:
int[][] arr = {{1, 2}, null, {3}};→ 第二行是null,遍历时必须判空 - 非法:
int[][] arr = new int[2][3] {{1,2}, {3,4,5}};—— 规则数组声明与静态初始化语法冲突 - 冗余但合法:
int[][] arr = new int[][] {{1,2}, {3,4}};,但推荐省略new int[][],直接用大括号
访问与遍历时必须动态获取每行长度
不能依赖某一行的长度代表整体列数,尤其在不规则场景下:
- 错误写法:
for (int j = 0; j —— 若 <code>arr[0]为null或其他行长度不同,会出错 - 正确做法:
for (int i = 0; i - 即使使用规则数组,也建议用
arr[i].length而非arr[0].length,增强健壮性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











