概述:
用来存放相同类型数据的容器叫做数组。我们学过的数组是存放基本数据类型的,而且这些元素呈线性排列,所以这种数组称为一维数组。其实数组元素的数据类型可以是任意类型,一维数组也不例外,所以我们把存放一维数组的容器称为二维数组。说白了就是一维数组的数组,二维数组是特殊的一维数组。在二维数组中包含的数组称为行,每个数组里面的元素称为列。有了行与列的概念,二维数组元素在数学中的排列方式就可以看成矩阵。
二维数组定义和初始化:
动态初始化
格式:
数据类型[][] 数组名 = new 数据类型[m][n];
m 表示二维数组可以存放m个一维数组,相当于这个矩阵的“行数”
n 每个一维数组有n个元素,相当于这个矩阵的“列数”
静态初始化
格式:
数据类型[][] 数组名 = {{数据1, 数据2, ...},{数据3, 数据4, ..}, ...};
请注意:Java并不是直接支持二维数组的,而是可以将一维数组作为数组的元素,所以静态初始化时必然出现两层大括号。
以下语句
int arr[][] = {1, 2, 3, 4, 5, 6}
在Java中会弹出如下错误:
所以静态初始化二维数组时同一行元素都要用大括号括起来
二维数组的索引和遍历
二维数组的索引号和一维数组是相似的,一维数组索引号是从0开始到长度 - 1,但二维数组是有两个索引号,其中第一个索引号是数组中所包含的一维数组的编号,从0到所含一维数组数量 - 1;第二个索引号是所含一维数组中的元素的编号,从0到所含一维数组长度 - 1。我们可以将第一个索引号理解为行索引,第二个索引号称为列索引。
在遍历之前,我们需要知道数组的一个属性——数组名.length,这是指一维数组的长度,也就是一维数组可包含几个元素。But,在二维数组中,数组名.length指的是数组中包含了几个一维数组,数组名[行索引].length指的是二维数组所含一维数组的长度,也就是所含的一维数组包含了几个元素。
一维数组用一个for循环即可遍历,而二维数组需要双层for循环,外层for循环用于访问二维数组的某一行,内层for循环访问二维数组当前行的某一列,遍历格式如下
for (int i = 0; i < 数组名.length; i++) {
for (int j = 0; j < 数组名[i].length; j++) {
//你的代码
}
}
数组名[i][j]表示二位数组里面所含第i + 1个一维数组中的第j + 1个元素,说白了就是矩阵中的第i + 1行第j + 1列。
二维数组的使用场景
我们学到一维数组和方法之后了解到想在函数中返回多个数据,可将函数返回值定义成数组类型,要是在返回多组数据时,二维数组就可以派上用场。现实生活中的“成绩单”也可以用到二维数组的。
案例
小A和小B一起考了驾照,他们科目一到科目四的成绩如下
科目一 | 科目二 | 科目三 | 科目四 | |
小A | 93 | 85 | 95 | 96 |
小B | 95 | 90 | 100 | 98 |
要求用二维数组存放,并打印输出他们俩成绩加起来之后的总和
public class E {
public static void main(String[] args) {
//定义一个二维数组存放两人考试成绩, 行索引表示小A还是小B,列索引表示个人某一科目的成绩
int[][] score = {{93, 85, 95, 96}, {95, 90, 100, 98}};
//定义一个变量存放两人成绩总和
int sum = 0;
//遍历数组计算成绩总和
for (int i = 0; i < score.length; i++) {
for (int j = 0; j < score[i].length; j++) {
//将成绩累加到总和
sum += score[i][j];
}
}
//将所得结果打印
System.out.println(sum);
}
}