java不支持编译期定义的多维不规则数组,所谓“不规则”实为数组嵌套实现;需用int[][] arr = new int[3][]声明外层,再逐行初始化各子数组长度,访问前须判空。

Java里没有“多维不规则数组”这个语法糖
Java不支持像Python的list[list[int]]或C#的int[][][]那种编译期就允许每维长度不同的“真正不规则多维数组”。所谓“不规则”,其实是靠数组嵌套实现的——比如int[][]本质是“一维数组,每个元素是int[]”,各子数组长度完全可以不同。
用new int[n][]声明并逐层初始化
这是最常用也最安全的方式:先声明外层数组,再对每个位置单独分配内层数组。关键在第二维起不能写成new int[n][m](那是规则矩形数组)。
- 错误写法:
int[][] arr = new int[3][4];→ 所有行固定为4列 - 正确写法:
int[][] arr = new int[3][];→ 外层3个槽位,每个都为null - 然后手动赋值:
arr[0] = new int[2]; arr[1] = new int[5]; arr[2] = new int[1]; - 访问前务必判空:
if (arr[i] != null && j ,否则<code>NullPointerException或ArrayIndexOutOfBoundsException
初始化时用匿名内部数组更简洁
如果数据已知且不常变动,直接用大括号初始化可省去显式new,语义更清晰,也天然规避未初始化问题。
- 示例:
int[][] jagged = { {1, 2}, {3, 4, 5, 6}, {7} }; - 注意:大括号里每一组必须是完整的一维数组字面量,不能混用变量或表达式(如
{arr1, arr2}可以,但{new int[len1], new int[len2]}不行) - 这种写法生成的数组不可变长度——你不能之后给
jagged[0]重新赋一个更长的int[],只是引用可变,原数组对象本身长度锁死
泛型容器比原始数组更灵活但有代价
如果维度动态性很强(比如第三维还要嵌套不同长度的列表),硬套int[][][]会迅速失控。此时该考虑List<list>>></list>这类嵌套集合。
立即学习“Java免费学习笔记(深入)”;
- 优势:长度完全动态、支持增删、自带
null安全(空集合非null) - 代价:装箱开销(
Integervsint)、内存占用高、随机访问稍慢 - 别踩坑:避免
List<int></int>——泛型不支持基本类型,只能用int[]数组作为元素,这又绕回原始数组的老问题 - 真实场景建议:数值密集计算用嵌套数组+手动管理;结构频繁变化或含混合类型,选嵌套
ArrayList
真正麻烦的不是怎么写,而是后续所有遍历、序列化、传参时都要主动检查每层长度。没人帮你兜底,arr[i][j]看着简单,背后全是if和length调用。










