Java不支持真正不规则列长的多维数组,但可通过“数组的数组”模拟:先声明外层数组(如int[][]),再逐行为内层分配不同长度的一维数组,形成锯齿数组;也可用静态初始化{ {1,2}, {3,4,5,6}, {7} }或动态构建实现。

Java 中多维数组本身不支持真正意义上的“不规则列长”(即像 Python 的 list of lists 那样每行长度自由),但可以通过 数组的数组(即一维数组元素为引用类型)来模拟——最常见的是声明为 int[][]、String[][] 等,然后为每一行单独分配不同长度的一维数组。
声明时只分配外层数组
先创建一个一维引用数组,长度代表“行数”,但每个元素初始为 null:
int[][] jagged = new int[3][]; // 3 行,每行尚未分配 // 此时 jagged[0], jagged[1], jagged[2] 全为 null
逐行为内层数组分配不同长度
根据需要,给每一行独立 new 一个一维数组,长度可各不相同:
jagged[0] = new int[2]; // 第 0 行:2 列 jagged[1] = new int[5]; // 第 1 行:5 列 jagged[2] = new int[1]; // 第 2 行:1 列
这样就形成了“锯齿数组”(jagged array),也叫不规则二维数组。
立即学习“Java免费学习笔记(深入)”;
初始化时直接定义不规则结构
也可以用静态初始化语法一步到位,更简洁直观:
int[][] nums = {
{1, 2},
{3, 4, 5, 6},
{7}
};
// nums.length == 3,nums[0].length == 2,nums[1].length == 4,nums[2].length == 1
动态构建常见场景示例
比如读取多行输入,每行数字个数不定:
- 先按行读取字符串,用
split()拆出数字字符串数组 - 对每行新建对应长度的
int[],再逐个解析赋值 - 把该行数组存入外层数组对应位置
String[] lines = {"1 2", "3 4 5", "6 7 8 9"};
int[][] grid = new int[lines.length][];
for (int i = 0; i < lines.length; i++) {
String[] parts = lines[i].split("\s+");
grid[i] = new int[parts.length];
for (int j = 0; j < parts.length; j++) {
grid[i][j] = Integer.parseInt(parts[j]);
}
}
这种写法灵活、内存高效,是 Java 中实现“不规则二维结构”的标准方式。注意访问前要判空或确保已分配,否则会触发 NullPointerException。


















