
5.3 二维数组
Java语言中数组元素还可以是一个数组,这样的数组称为数组的数组或二维数组。
5.3.1 二维数组定义
二维数组的使用也分为声明、创建和初始化三个步骤。
1.二维数组声明
二维数组有下面三种等价的声明格式:

这里,elementType为数组元素的类型,arrayName为数组名。推荐使用第一种方法声明二维数组。下面语句声明了一个整型二维数组matrix和一个String型二数组cities。

2.创建二维数组
创建二维数组就是为二维数组的每个元素分配存储空间。系统先为高维分配引用空间,然后再顺次为低维分配空间。二维数组的创建也使用new运算符,分配空间有两种方法,下面是直接为每一维度分配空间。

这种方法适用于数组的低维具有相同个数的数组元素。在Java中,二维数组是数组的数组,即数组元素也是一个数组。上述语句执行后创建的数组如图5-4所示,二维数组matrix有matrix[0]和matrix[1]两个元素,它们又都是数组,各有三个元素。在图5-4中,共有matrix、matrix[0]和matrix[1]三个对象。

图5-4 matrix数组元素空间的分配
创建了二维数组后,它的每个元素被指定为默认值。上述语句执行后,数组matrix的6个元素值都被初始化为0。
在创建二维数组时,也可以先为第一维分配空间,然后再为第二维分配空间。

5.3.2 数组元素的使用
访问二维数组的元素,使用下面的形式:

其中index1和index2为数组元素下标,可以是整型常数或表达式。同样,每一维的下标也是从0到该维的长度减1。
下面代码给matrix数组元素赋值:

下面代码输出matrix[1][2]元素值:

与访问一维数组一样,访问二维数组元素时,下标也不能超出范围,否则抛出异常。可以用matrix.length得到数组matrix的大小,结果为2;用matrix[0].length得到matrix[0]数组的大小,结果为3。
对二维数组的第一维通常称为行,第二维称为列。要访问二维数组的所有元素,应该使用嵌套的for循环。如下面代码输出matrix数组中所有元素。

同样,在访问二维数组元素的同时,可以对元素处理,如计算行的和或列的和等。
5.3.3 数组初始化器
对于二维数组也可以使用初始化器在声明数组的同时为数组元素初始化。例如:

matrix数组是3行4列的数组。多维数组每一维也都有一个length成员表示数组的长度。matrix.length的值是3,matrix[0].length的值是4。
5.3.4 实例:矩阵乘法
使用二维数组可以计算两个矩阵的乘积。如果矩阵A乘以矩阵B得到矩阵C,则必须满足如下要求:
(1)矩阵A的列数与矩阵B的行数相等。
(2)矩阵C的行数等于矩阵A的行数,列数等于矩阵B的列数。
例如,下面的例子说明两个矩阵是如何相乘的。

在结果矩阵中,第1行第1列的元素是9,它是通过下列计算得来的。
1 × 4 + 2 × 2 + 1 × 1 = 9
即若矩阵Amn×Bnl = Cml,则

其中,Amn表示m×n矩阵,cij是矩阵C的第i行j列元素。
程序5.8 MatrixMultiply.java

程序运行结果为:

5.3.5 不规则二维数组
Java的二维数组是数组的数组,对二维数组声明时可以只指定第一维的大小,第二维的每个元素可以指定不同的大小。例如:

这种方法适用于低维数组元素个数不同的情况,即每个数组的元素个数可以不同。对于引用类型的数组,除了为数组分配空间外,还要为每个数组元素的对象分配空间。

cities数组元素空间的分配情况如图5-5所示。

图5-5 cities数组元素空间的分配
杨辉三角形,又称帕斯卡三角形,是二项式系数在三角形中的一种几何排列。下面的程序打印输出前10行杨辉三角形。
程序5.9 Triangle.java

程序运行结果为:

提示:Java支持多维数组,如下面代码声明并创建一个三维数组。
