Java中二维数组本质是“数组的数组”,即一维数组的每个元素指向另一个一维数组,支持不规则结构;声明推荐int[][] arr,静态初始化用花括号赋值,动态初始化需先分配行再逐行分配列;遍历时须按行取arr[i].length,不可默认等长。

二维数组的本质是“数组的数组”
Java 中没有真正意义上的“二维数组”,它其实是一维数组的每个元素指向另一个一维数组。这意味着:每个“行”可以独立分配长度,形成不规则结构(如第一行 3 个元素、第二行 5 个元素)。这种引用嵌套特性决定了声明、初始化和遍历时不能简单套用矩阵思维。
声明与初始化的两种核心方式
声明推荐使用 int[][] arr 形式,语义清晰;避免 int[] arr[] 这类 C 风格写法。
-
静态初始化:适合已知全部数据的场景,编译器自动推断维度
String[][] teams = {{"库里", "汤普森"}, {"字母哥", "米德尔顿", "霍勒迪"}, {"东契奇"}}; -
动态初始化:分两步——先分配行数,再逐行为每行分配列数
int[][] matrix = new int[4][];matrix[0] = new int[2]; matrix[1] = new int[5]; matrix[2] = new int[1]; matrix[3] = new int[3];
注意:new int[3][4]是规则数组(每行固定 4 列),而new int[3][]是不规则数组的起点。
安全访问与健壮遍历的关键细节
由于每行长度可能不同,绝不能假设 arr[i].length == arr[0].length。遍历时必须对每一行单独取长度。
- 获取总行数:
arr.length - 获取第 i 行元素个数:
arr[i].length(访问前建议判空,防止 NullPointerException) - 标准 for 循环遍历:
for (int i = 0; i <br> <code>if (arr[i] != null) {
for (int j = 0; j <br> <code>System.out.print(arr[i][j] + " ");
}
}} - 增强 for 循环更简洁,适合只读场景:
for (String[] row : teams) {
if (row != null) {
for (String player : row) {
System.out.println(player);
}
}}
实际开发中的典型应用模式
二维数组常用于表示具有层级或分组关系的数据,而非纯数学矩阵。
立即学习“Java免费学习笔记(深入)”;
- 学生成绩分班管理:每行代表一个班级,每列是该班某学生分数,各班人数不同
-
稀疏表格建模:如用户权限配置,
permissions[userIndex][permissionId]可跳过空行节省空间 - 动态网格渲染:游戏地图中,某些区域无需完整填充,用不规则二维数组更贴近逻辑
- 避免误用:若需行列严格对齐、频繁数学运算(如转置、乘法),应考虑封装为 Matrix 类,而非裸用二维数组


















