声明和初始化 String 二维数组
1 声明
声明一个 String 类型的二维数组,语法如下:

// 方式一:推荐,更清晰 String[][] names; // 方式二:C/C++ 风格,在Java中也可以,但不推荐 String names[][];
2 初始化
初始化可以分为静态初始化和动态初始化。
静态初始化
在声明的同时就为数组分配空间并赋值。
// 3行4列的二维数组
String[][] students = {
{"张三", "李四", "王五", "赵六"},
{"钱七", "孙八", "周九", "吴十"},
{"郑一", "王二", "冯三", "陈四"}
};
// 2行2列的二维数组
String[][] matrix = {
{"Hello", "World"},
{"Java", "Programming"}
};
动态初始化
先声明数组,然后分别指定行数和列数,再为每个元素赋值。
// 1. 声明一个3行2列的二维数组 String[][] cities = new String[3][2]; // 2. 为每个元素赋值 cities[0][0] = "北京"; cities[0][1] = "上海"; cities[1][0] = "广州"; cities[1][1] = "深圳"; cities[2][0] = "成都"; cities[2][1] = "重庆";
注意: Java 中二维数组不要求每一行的列数都相同(即“锯齿数组”),但这种情况较少使用,通常我们使用规则的二维数组。

访问和修改元素
使用 行索引 和 列索引 来访问或修改特定位置的元素,索引从 0 开始。
String[][] students = {
{"张三", "李四"},
{"王五", "赵六"}
};
// 访问第1行第0列的元素 (索引从0开始)
String student = students[0][0]; // student 的值是 "张三"
System.out.println("第一个学生是: " + student);
// 修改第1行第1列的元素
students[0][1] = "孙八";
System.out.println("修改后的第二个学生是: " + students[0][1]); // 输出 "孙八"
遍历二维数组
遍历二维数组通常需要使用两层嵌套的 for 循环:外层循环遍历行,内层循环遍历列。
1 使用经典的 for 循环
String[][] matrix = {
{"A", "B", "C"},
{"D", "E", "F"},
{"G", "H", "I"}
};
System.out.println("使用 for 循环遍历:");
for (int i = 0; i < matrix.length; i++) { // matrix.length 获取的是行数
for (int j = 0; j < matrix[i].length; j++) { // matrix[i].length 获取的是第 i 行的列数
System.out.print(matrix[i][j] + " ");
}
System.out.println(); // 每行结束后换行
}
输出:
使用 for 循环遍历:
A B C
D E F
G H I
2 使用增强型 for 循环 (for-each)
这种方式代码更简洁,但无法获取元素的索引。

String[][] matrix = {
{"A", "B", "C"},
{"D", "E", "F"},
{"G", "H", "I"}
};
System.out.println("\n使用增强型 for 循环遍历:");
for (String[] row : matrix) { // 外层循环遍历每一行(每一行是一个 String[] 数组)
for (String element : row) { // 内层循环遍历当前行的每一个元素
System.out.print(element + " ");
}
System.out.println();
}
输出:
使用增强型 for 循环遍历:
A B C
D E F
G H I
获取二维数组的维度
- 行数:
array.length - 列数:
array[0].length(获取第一行的长度,前提是数组至少有一行)
String[][] data = {
{"Row1-Col1", "Row1-Col2"},
{"Row2-Col1", "Row2-Col2", "Row2-Col3"}, // 这是一个非规则数组
{"Row3-Col1"}
};
int rows = data.length;
System.out.println("行数: " + rows); // 输出 3
// 列数不固定,需要分别获取每一行的列数
for (int i = 0; i < data.length; i++) {
int cols = data[i].length;
System.out.println("第 " + (i + 1) + " 行的列数: " + cols);
}
输出:
行数: 3
第 1 行的列数: 2
第 2 行的列数: 3
第 3 行的列数: 1
完整示例代码
下面是一个综合性的示例,展示了如何声明、初始化、修改、遍历和打印一个 String 二维数组。
public class String2DArrayExample {
public static void main(String[] args) {
// 1. 静态初始化一个学生成绩表
String[][] gradeBook = {
{"张三", "语文", "95"},
{"李四", "数学", "88"},
{"王五", "英语", "92"},
{"赵六", "物理", "85"}
};
// 2. 访问并打印某个学生的信息
System.out.println("第一个学生的姓名是: " + gradeBook[0][0]);
System.out.println("第一个学生的科目是: " + gradeBook[0][1]);
System.out.println("第一个学生的成绩是: " + gradeBook[0][2]);
// 3. 修改某个学生的成绩
System.out.println("\n将李四的数学成绩从 " + gradeBook[1][2] + " 改为 95");
gradeBook[1][2] = "95";
// 4. 遍历并打印整个成绩表
System.out.println("\n--- 完整成绩表 ---");
// 打印表头
System.out.println("姓名\t科目\t成绩");
System.out.println("--------------------");
// 遍历数据
for (int i = 0; i < gradeBook.length; i++) {
for (int j = 0; j < gradeBook[i].length; j++) {
System.out.print(gradeBook[i][j] + "\t"); // \t 是制表符,用于对齐
}
System.out.println(); // 每行结束后换行
}
// 5. 使用增强型for循环遍历
System.out.println("\n--- 使用增强型for循环遍历 ---");
for (String[] record : gradeBook) {
for (String info : record) {
System.out.print(info + "\t");
}
System.out.println();
}
}
}
输出结果:
第一个学生的姓名是: 张三
第一个学生的科目是: 语文
第一个学生的成绩是: 95
将李四的数学成绩从 88 改为 95
--- 完整成绩表 ---
姓名 科目 成绩
--------------------
张三 语文 95
李四 数学 95
王五 英语 92
赵六 物理 85
--- 使用增强型for循环遍历 ---
张三 语文 95
李四 数学 95
王五 英语 92
赵六 物理 85
常见错误
-
ArrayIndexOutOfBoundsException(数组越界异常)- 原因: 尝试访问一个不存在的索引。
- 示例:
String[][] arr = new String[2][2]; // arr 只有 2 行 (0, 1) 和 2 列 (0, 1) String s = arr[2][0]; // 错误!行索引 2 超出范围 String t = arr[0][2]; // 错误!列索引 2 超出范围
-
NullPointerException(空指针异常)-
原因: 尝试在一个为
null的数组或其行上操作。 -
示例:
String[][] arr = null; arr[0][0] = "Hello"; // 错误!arr 本身是 null String[][] arr2 = new String[2]; // 只分配了行,行内的元素是 null arr2[0][0] = "Hello"; // 错误!arr2[0] 是 null // 正确的做法是先初始化每一行 arr2[0] = new String[2]; arr2[0][0] = "Hello";
-
希望这个详细的解释能帮助你完全理解 Java 中的 String 二维数组!
