
5.5 二维数组及其使用
现在,我们对一维数组的声明、初始化、赋值、使用、遍历都有了认识,也可以用一维数组来解决我们生活中的许多实际问题了,比如统计和处理班级某学科的学生成绩。可是还有一种情况,比如分别统计班级Java课程、数据库课程、操作系统课程的学生的总分。这时,更像是一张二维表格,一维数组似乎没有那么适合了。本节就让我们一起来认识一下二维数组!
5.5.1 二维数组的声明
一维数组的声明是一个[],二维数组是两个[],第一个[]看作存放的元素是一维数组,第二个[]存放的是基本数据类型。二维数组的定义方式如下:

其中,type表示数组的数据类型,也就是数组中元素的类型;array表示数组名声明一个简单的二维数组,存储整型元素,其定义方式如下:

在上面的示例中,int用来标识数组中元素的类型,scores用来指代二维数组名,[][]表示该数组为二维数组。
5.5.2 二维数组的初始化
二维数组的初始化方式和一维数组的初始化方式类似,也是分为静态初始化、动态初始化、默认初始化3种方式。
1. 默认初始化
默认初始化是一次性创建所有的行和列,一般使用关键字new来完成。其基本方式如下:

在上面的示例中,x标识这个数组的行数(相当于一维数组的数目),y标识这个数组的列数(一维数组中的元素个数)。比如:班上有10名学生,分别统计他们的Java课程、数据库课程、操作系统课程的成绩,就应该用一张3×10的表格去存储,用二维数组就可以表示为:

在上面的示例中定义了一个二维数组,其中数组元素的类型是int,数组名是scores,申请了一个3行10列的数组。
2. 动态初始化
动态初始化是先新建行的数目,再分别去新建列的数目,这样就可以实现二维数组的动态初始化。这样做的好处是可以根据情况创建不同的列数来节省空间,不用必须新建一个规则。其基本方式如下:

比如:小甜甜选修了三门课,小粉粉选修了四门课,要求统计他们的课程分数。现在有两种方案:
(1)我们可以按最大的行和列来申请数组,就是2×4,这样小甜甜就浪费了一个空间。
(2)我们可以用不规则的数组初始化方式来新建一个数组,第一行有3个元素,第二行有4个元素,其创建方式如下:

3. 静态初始化
静态初始化就是在创建二维数组的时候赋值。这种方式能够很直观地看到数组的定义和赋值情况,其基本定义方式如下:

比如:小甜甜选修了三门课,小粉粉选修了四门课,现在来统计他们的课程分数。使用静态初始化定义数组,如下所示:

注意
没有new type[][x]这种写法,有new type[x][]这种写法。
上例中的二维数组的结构如图5.6所示。

图5.6 二维数组结构
5.5.3 二维数组的使用
二维数组的使用要分成两部分来理解:第一部分是二维数组中存放的一维数组,第二部分是一维数组中的元素值。第一个[]是用来索取一维数组的,第二个[]是用来索取一维数组中元素的。读取二维数组中的值的基本方式如下:

二维数组本身可以看作一个数组,它存储的元素的类型是一维数组(行),一维数组中存储的元素是该行列的数量。所以我们遍历的时候的顺序应该是,先取得行,再去取得行中数据对应的列。其操作方式如示例5-8所示。
【示例5-8】遍历二维数组

程序编译后,运行结果如下:

使用增强for循环去遍历二维数组,如示例5-9所示。
【示例5-9】增强for循环遍历二维数组

程序编译后,运行结果如下:

示例5-8和示例5-9展示了如何使用for循环来遍历二维数组,需要注意的是,增强for循环都是进行的赋值操作,并不是元素本身。