Appearance
8.5 二维数组入门
二维数组的概念
二维数组是一种特殊的数组,它的元素是一维数组。可以将二维数组看作是一个表格,其中第一个维度表示行,第二个维度表示列。
二维数组的定义
在 Java 中,二维数组的定义有两种方式:
方式一:声明二维数组变量
java
数据类型[][] 数组名;方式二:声明二维数组变量(C 风格)
java
数据类型 数组名[][];示例:
java
// 声明整型二维数组
int[][] matrix;
// 或
int matrix[][];
// 声明字符串二维数组
String[][] names;
// 或
String names[][];二维数组的初始化
二维数组的初始化有三种方式:静态初始化、动态初始化和默认初始化。
1. 静态初始化
静态初始化是在声明二维数组的同时为数组元素赋值。
语法:
java
数据类型[][] 数组名 = {
{元素1, 元素2, 元素3, ...},
{元素1, 元素2, 元素3, ...},
...
};示例:
java
// 静态初始化整型二维数组
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 静态初始化字符串二维数组
String[][] names = {
{"Alice", "Bob"},
{"Charlie", "David"},
{"Eve", "Frank"}
};2. 动态初始化
动态初始化是先声明二维数组,然后使用 new 关键字创建数组对象并指定维度。
语法:
java
// 方式一:指定行数和列数
数据类型[][] 数组名 = new 数据类型[行数][列数];
// 方式二:只指定行数,列数可以不同
数据类型[][] 数组名 = new 数据类型[行数][];示例:
java
// 动态初始化整型二维数组,3行3列
int[][] matrix = new int[3][3];
// 动态初始化整型二维数组,只指定行数
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2]; // 第一行有 2 列
jaggedArray[1] = new int[3]; // 第二行有 3 列
jaggedArray[2] = new int[4]; // 第三行有 4 列3. 默认初始化
当使用动态初始化创建二维数组时,数组元素会被自动赋予默认值。
示例:
java
// 动态初始化整型二维数组,默认值为 0
int[][] matrix = new int[2][2];
System.out.println(matrix[0][0]); // 输出 0
System.out.println(matrix[0][1]); // 输出 0
System.out.println(matrix[1][0]); // 输出 0
System.out.println(matrix[1][1]); // 输出 0
// 动态初始化字符串二维数组,默认值为 null
String[][] names = new String[2][2];
System.out.println(names[0][0]); // 输出 null
System.out.println(names[0][1]); // 输出 null
System.out.println(names[1][0]); // 输出 null
System.out.println(names[1][1]); // 输出 null二维数组的访问
二维数组的访问是通过行索引和列索引来实现的。
语法:
java
数组名[行索引][列索引]示例:
java
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 访问元素
int element = matrix[1][2]; // 获取第二行第三列的元素,值为 6
System.out.println(element); // 输出 6
// 修改元素
matrix[0][0] = 100; // 将第一行第一列的元素修改为 100
System.out.println(matrix[0][0]); // 输出 100二维数组的遍历
二维数组的遍历需要使用嵌套循环,外层循环遍历行,内层循环遍历列。
1. 使用嵌套 for 循环遍历
java
public class TwoDimensionalArrayTraversalExample {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 使用嵌套 for 循环遍历二维数组
for (int i = 0; i < matrix.length; i++) { // 遍历行
for (int j = 0; j < matrix[i].length; j++) { // 遍历列
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}2. 使用增强型 for 循环遍历
java
public class TwoDimensionalArrayForEachExample {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 使用增强型 for 循环遍历二维数组
for (int[] row : matrix) { // 遍历行
for (int element : row) { // 遍历列
System.out.print(element + " ");
}
System.out.println();
}
}
}二维数组的长度
二维数组的长度是指数组的行数,可以通过 数组名.length 来获取。每一行的长度可以通过 数组名[行索引].length 来获取。
java
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println("Number of rows: " + matrix.length); // 输出 3
System.out.println("Number of columns in row 0: " + matrix[0].length); // 输出 3
System.out.println("Number of columns in row 1: " + matrix[1].length); // 输出 3不规则二维数组
在 Java 中,二维数组的每一行可以有不同的长度,这样的数组称为不规则二维数组(也称为锯齿状数组)。
java
public class JaggedArrayExample {
public static void main(String[] args) {
// 创建不规则二维数组
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2]; // 第一行有 2 列
jaggedArray[1] = new int[3]; // 第二行有 3 列
jaggedArray[2] = new int[4]; // 第三行有 4 列
// 为不规则二维数组赋值
int value = 1;
for (int i = 0; i < jaggedArray.length; i++) {
for (int j = 0; j < jaggedArray[i].length; j++) {
jaggedArray[i][j] = value;
value++;
}
}
// 遍历不规则二维数组
for (int i = 0; i < jaggedArray.length; i++) {
for (int j = 0; j < jaggedArray[i].length; j++) {
System.out.print(jaggedArray[i][j] + " ");
}
System.out.println();
}
}
}二维数组的应用场景
- 矩阵运算:二维数组可以用于表示矩阵,进行矩阵的加法、乘法等运算
- 表格数据:二维数组可以用于存储表格数据,如学生成绩表
- 游戏棋盘:二维数组可以用于表示游戏棋盘,如井字棋、五子棋等
- 图像处理:二维数组可以用于表示图像的像素数据
示例:二维数组的使用
示例 1:矩阵加法
java
public class MatrixAdditionExample {
public static void main(String[] args) {
int[][] matrix1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int[][] matrix2 = {
{9, 8, 7},
{6, 5, 4},
{3, 2, 1}
};
int[][] result = addMatrices(matrix1, matrix2);
System.out.println("Matrix 1:");
printMatrix(matrix1);
System.out.println("Matrix 2:");
printMatrix(matrix2);
System.out.println("Result:");
printMatrix(result);
}
public static int[][] addMatrices(int[][] matrix1, int[][] matrix2) {
int rows = matrix1.length;
int columns = matrix1[0].length;
int[][] result = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
result[i][j] = matrix1[i][j] + matrix2[i][j];
}
}
return result;
}
public static void printMatrix(int[][] matrix) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
}示例 2:学生成绩表
java
public class StudentGradesExample {
public static void main(String[] args) {
String[] students = {"Alice", "Bob", "Charlie", "David"};
String[] courses = {"Math", "English", "Science"};
int[][] grades = {
{90, 85, 95},
{80, 75, 85},
{95, 90, 80},
{70, 80, 75}
};
// 打印成绩表
System.out.println("Student Grades:");
System.out.print("\t");
for (String course : courses) {
System.out.print(course + "\t");
}
System.out.println();
for (int i = 0; i < students.length; i++) {
System.out.print(students[i] + "\t");
for (int j = 0; j < courses.length; j++) {
System.out.print(grades[i][j] + "\t");
}
System.out.println();
}
// 计算每个学生的平均成绩
System.out.println("\nAverage Grades:");
for (int i = 0; i < students.length; i++) {
int sum = 0;
for (int j = 0; j < courses.length; j++) {
sum += grades[i][j];
}
double average = (double) sum / courses.length;
System.out.println(students[i] + ": " + average);
}
}
}常见问题
1. 数组索引越界
症状:运行时错误:ArrayIndexOutOfBoundsException
解决方案:确保行索引和列索引在有效范围内
2. 空指针异常
症状:运行时错误:NullPointerException
解决方案:确保二维数组已经初始化,且每一行也已经初始化
3. 不规则二维数组的处理
症状:在处理不规则二维数组时,列索引越界
解决方案:在访问列元素时,使用 数组名[行索引].length 来获取当前行的列数
总结
二维数组是 Java 中一种重要的数据结构,它可以看作是一个表格,其中第一个维度表示行,第二个维度表示列。二维数组的初始化有静态初始化、动态初始化和默认初始化三种方式。
在使用二维数组时,需要注意:
- 二维数组的访问通过行索引和列索引来实现
- 二维数组的遍历需要使用嵌套循环
- 二维数组的每一行可以有不同的长度,这样的数组称为不规则二维数组
- 避免数组索引越界和空指针异常
通过合理使用二维数组,可以有效地处理矩阵运算、表格数据、游戏棋盘等二维数据结构。
