Java二维数组是“数组的数组”,声明仅定义引用变量(值为null),创建时分配外层数组并可选内层空间,初始化决定结构规则性与默认值;访问需判空防NullPointerException。

Java 二维数组不是“表格”,而是“数组的数组”——外层数组每个元素都指向一个一维数组对象。声明、创建(内存分配)和初始化三步必须理清,否则容易出现 NullPointerException 或长度误判。
声明:只定义类型和名字,不占堆内存
声明只是告诉编译器变量类型,例如:
-
int[][] matrix;—— 合法声明,matrix是栈中一个引用变量,当前值为null -
String[][] words;—— 同样未分配任何堆空间,不能直接访问words[0][0] - 写法
int[] arr[]虽语法允许,但不推荐;int[][]更清晰表达“二维”语义
创建(内存分配):决定行数,可选列数
用 new 在堆中分配外层数组,并可同时或分步指定内层数组空间:
-
规则结构:每行长度固定
int[][] grid = new int[4][5];→ 创建 4 行 × 5 列的矩形结构,所有元素自动初始化为0 -
不规则结构:先定行数,再逐行分配
int[][] jagged = new int[3][];→ 外层数组有 3 个null引用
随后:jagged[0] = new int[2]; jagged[1] = new int[4]; jagged[2] = new int[1];
初始化:赋值方式决定数组形态与默认值
初始化可在声明时完成,也可后续逐元素赋值,关键区别在于是否显式指定内容:
立即学习“Java免费学习笔记(深入)”;
-
静态初始化(大括号赋值)
int[][] data = {{1,2}, {3,4,5}, {}};→ 行数由大括号对数决定(3 行),每行长度由内部元素个数决定(2、3、0),未赋值位置按类型默认(如int为 0) -
动态初始化后赋值
若用new int[2][3]创建,则所有 6 个元素已为0;后续可覆盖:data[0][1] = 99; -
混合使用
String[][] table = new String[2][];后,table[0] = new String[]{"a", "b"};,table[1] = new String[]{"x"};,形成不规则字符串数组
内存与访问要点:引用链与空指针风险
二维数组涉及两层引用关系,访问前务必确认非空:
-
arr.length返回外层数组长度(即行数) -
arr[i].length才是第i行的列数;若该行未new,调用会抛出NullPointerException - 所有数组元素默认值遵循基本类型/引用类型规则:
int→0,boolean→false,String→null - 遍历时建议先判空:
if (arr != null && arr[i] != null)再访问arr[i][j]


















