声明和初始化
创建二维 String 数组主要有两种方式:静态初始化和动态初始化。

静态初始化
在声明数组的同时就为其分配空间并赋值。
// 语法:数据类型[][] 数组名 = new 数据类型[][]{{...}, {...}, ...};
// 创建一个 3x4 的二维 String 数组(3行4列)
String[][] names = {
{"Alice", "Bob", "Charlie", "David"},
{"Eve", "Frank", "Grace", "Hank"},
{"Ivy", "Jack", "Kate", "Leo"}
};
// 也可以先声明,再初始化
String[][] cities;
cities = new String[][] {
{"Beijing", "Shanghai"},
{"New York", "Los Angeles", "Chicago"},
{"London", "Paris", "Berlin", "Madrid"}
};
动态初始化
先声明数组并指定其行数和列数,然后再为每个元素赋值。
// 语法:数据类型[][] 数组名 = new 数据类型[行数][列数]; // 先声明一个 2x3 的二维 String 数组 String[][] matrix = new String[2][3]; // 然后通过索引为每个元素赋值 matrix[0][0] = "A"; matrix[0][1] = "B"; matrix[0][2] = "C"; matrix[1][0] = "D"; matrix[1][1] = "E"; matrix[1][2] = "F";
注意:在 Java 中,二维数组的每一行(即内部的数组)长度可以不同,这被称为“不规则的二维数组”或“锯齿数组”。
// 创建一个不规则的二维 String 数组 String[][] jaggedArray = new String[3][]; // 只指定行数 // 为每一行分配不同大小的列数 jaggedArray[0] = new String[2]; // 第1行有2个元素 jaggedArray[1] = new String[4]; // 第2行有4个元素 jaggedArray[2] = new String[1]; // 第3行有1个元素 // 赋值 jaggedArray[0][0] = "One"; jaggedArray[0][1] = "Two"; jaggedArray[1][0] = "Three"; jaggedArray[1][1] = "Four"; jaggedArray[1][2] = "Five"; jaggedArray[1][3] = "Six"; jaggedArray[2][0] = "Seven";
访问和修改元素
使用 数组名[行索引][列索引] 的方式来访问或修改元素,索引从 0 开始。
String[][] names = {
{"Alice", "Bob"},
{"Charlie", "David"}
};
// 访问元素
String firstName = names[0][0]; // 获取 "Alice"
String secondName = names[1][1]; // 获取 "David"
System.out.println("First name: " + firstName);
System.out.println("Second name: " + secondName);
// 修改元素
names[0][0] = "Alice Smith";
System.out.println("Modified first name: " + names[0][0]); // 输出 "Alice Smith"
遍历二维数组
遍历二维数组通常需要使用嵌套的 for 循环:外层循环遍历行,内层循环遍历列。
使用经典的 for 循环
String[][] names = {
{"Alice", "Bob"},
{"Charlie", "David"},
{"Eve", "Frank"}
};
System.out.println("--- 遍历所有名字 ---");
for (int i = 0; i < names.length; i++) { // 遍历行 (names.length 是行数)
for (int j = 0; j < names[i].length; j++) { // 遍历列 (names[i].length 是第 i 行的列数)
System.out.print(names[i][j] + " ");
}
System.out.println(); // 每行结束后换行
}
输出:
--- 遍历所有名字 ---
Alice Bob
Charlie David
Eve Frank
使用增强型 for 循环 (for-each)
这种方式代码更简洁,但无法获取元素的索引。
String[][] names = {
{"Alice", "Bob"},
{"Charlie", "David"}
};
System.out.println("\n--- 使用 for-each 遍历 ---");
// 第一个 String[] 代表每一行(一个一维数组)
// 第二个 String 代表该行中的每一个元素
for (String[] row : names) {
for (String name : row) {
System.out.print(name + " ");
}
System.out.println();
}
输出:
--- 使用 for-each 遍历 ---
Alice Bob
Charlie David
获取数组长度
- 行数:
数组名.length - 列数:
数组名[行索引].length(因为每行的列数可能不同)
String[][] cities = {
{"Beijing", "Shanghai"},
{"New York", "Los Angeles", "Chicago"}
};
int rows = cities.length; // 行数
System.out.println("行数: " + rows); // 输出 2
int colsInRow0 = cities[0].length; // 第0行的列数
int colsInRow1 = cities[1].length; // 第1行的列数
System.out.println("第0行的列数: " + colsInRow0); // 输出 2
System.out.println("第1行的列数: " + colsInRow1); // 输出 3
完整示例代码
这是一个综合性的示例,展示了如何声明、初始化、遍历和操作二维 String 数组。
public class String2DArrayExample {
public static void main(String[] args) {
// 1. 静态初始化一个学生姓名的二维数组
String[][] students = {
{"张三", "李四", "王五"},
{"Alice", "Bob"},
{"Charlie", "David", "Eve", "Frank"}
};
// 2. 遍历并打印所有学生姓名
System.out.println("所有学生名单:");
print2DArray(students);
// 3. 访问并修改一个元素
System.out.println("\n将 'Bob' 修改为 'Robert'");
students[1][1] = "Robert";
System.out.println("修改后的名单:");
print2DArray(students);
// 4. 动态初始化一个课程表
String[][] schedule = new String[3][5]; // 3天,每天5节课
// 为课程表赋值
schedule[0][0] = "数学";
schedule[0][1] = "语文";
schedule[0][2] = "英语";
schedule[0][3] = "物理";
schedule[0][4] = "化学";
schedule[1][0] = "历史";
schedule[1][1] = "地理";
schedule[1][2] = "生物";
schedule[1][3] = "体育";
schedule[1][4] = "美术";
schedule[2][0] = "编程";
schedule[2][1] = "数据结构";
schedule[2][2] = "算法";
schedule[2][3] = "数据库";
schedule[2][4] = "软件工程";
// 5. 打印课程表
System.out.println("\n课程表:");
print2DArray(schedule);
}
/**
* 一个通用的打印二维String数组的方法
* @param array 要打印的二维数组
*/
public static void print2DArray(String[][] array) {
for (int i = 0; i < array.length; i++) {
System.out.print("第 " + (i + 1) + " 组: ");
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println(); // 换行
}
}
}
输出结果:
所有学生名单:
第 1 组: 张三 李四 王五
第 2 组: Alice Bob
第 3 组: Charlie David Eve Frank
将 'Bob' 修改为 'Robert'
修改后的名单:
第 1 组: 张三 李四 王五
第 2 组: Alice Robert
第 3 组: Charlie David Eve Frank
课程表:
第 1 组: 数学 语文 英语 物理 化学
第 2 组: 历史 地理 生物 体育 美术
第 3 组: 编程 数据结构 算法 数据库 软件工程
- 核心概念:二维
String数组是String类型的“数组的数组”。 - 声明初始化:静态初始化(直接赋值)和动态初始化(先分配空间再赋值)。
- 不规则数组:Java 支持每行长度不同的二维数组。
- 访问元素:使用
array[row][col]。 - 遍历:使用嵌套
for循环,外层循环行,内层循环列。 - 长度:
array.length是行数,array[i].length是第i行的列数。
