Java二维数组是“一维数组的数组”,声明如int[][] matrix,初始化需分配内存并赋值,遍历时每行长度独立,访问需双重下标且检查越界。

Java 二维数组不是“平面矩阵”,而是“一维数组的数组”——外层数组每个元素都指向一个独立的一维数组。理解这个嵌套引用结构,是写对声明、初始化和遍历的关键。
声明要体现“数组的数组”语义
推荐使用 int[][] matrix 形式声明,清晰表达二维意图;int[] matrix[] 虽语法合法,但易与C风格混淆,不建议日常使用。声明仅定义变量类型和名称,不分配内存,此时变量值为 null,不可直接访问下标。
- 正确:int[][] grid; —— 声明完成,grid 指向 null
- 错误:grid[0][0] = 1; —— 空指针异常(NullPointerException)
- 注意:不能只写 int[][]; 缺少变量名,编译不通过
初始化分静态与动态,规则与不规则都要会
初始化必须完成内存分配和元素赋值两个动作。静态初始化用大括号直接给值,编译器自动推断维度;动态初始化用 new 显式申请空间,再逐行或逐元素填充。
- 规则数组(矩形):new int[3][4] 创建 3 行 × 4 列,所有元素默认为 0
- 不规则数组(锯齿形):先 new int[3][] 分配外层 3 个 null 引用,再分别执行 jagged[0] = new int[2]; jagged[1] = new int[5]; 等
- 静态一步到位:int[][] data = {{1}, {2,3,4}, {5,6}}; —— 必须在声明时使用,不能赋值给已声明变量
- 匿名数组赋值:若变量已声明,可用 names = new String[][]{{"A"},{"B","C"}}; 补充初始化
遍历时必须用两层长度判断
二维数组没有统一的“列数”概念。外层数组的 length 是行数;每行的长度由 matrix[i].length 单独获取,尤其在不规则结构中,matrix[0].length 和 matrix[1].length 往往不同。
立即学习“Java免费学习笔记(深入)”;
- 传统 for:for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { … } }
- 增强 for:for (int[] row : matrix) { for (int val : row) { … } } —— 更简洁,但无法直接获知当前行列索引
- 常见错误:for (int j = 0; j < matrix[0].length; j++) —— 若第 0 行为空或长度不一致,会出错
访问与修改靠双下标,注意越界检查
通过 array[row][col] 访问任意位置,但下标必须满足:0 ≤ row < array.length 且 0 ≤ col < array[row].length。越界将抛出 ArrayIndexOutOfBoundsException。
- 赋值示例:scores[1][2] = 95;
- 读取示例:int top = grades[0][0];
- 安全访问建议:先判空 if (matrix != null && matrix.length > 0 && matrix[0] != null)
- 默认值规则:int 类型为 0,String 类型为 null,对象数组元素初始均为 null


















