二维数组

如果一维数组中的各个元素仍然是一个数组,那么它就是一个二维数组。二维数组常用于表示表,表中的信息以行和列的形式被组织,第一个下标代表元素所在的行,第二个下标代表元素所在的列。

创建二维数组

二维数组可以被看作是特殊的一维数组,因此二维数组的创建同样有两种方式。

先声明,再用new关键字进行内存分配

声明二维数组的语法如下:

     数组元素的类型 数组名字[ ][ ];
     数组元素的类型[ ][ ] 数组名字;

声明二维数组,代码如下:

int a[][]

同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用 new 关键字来分配内存,然后才可以访问每个元素。对于高维数组,有两种为数组分配内存的方式。

第一种内存分配方式是直接为每一维分配内存空间,代码如下:

a = new int[2][4]

上述代码创建了二维数组 a,二维数组 a 中包括两个长度为 4 的一维数组,内存分配如图5.2所示。

第二种内存分配方式是分别为每一维分配内存,代码如下:

a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];

上述代码创建了二维数组 a,但是只声明了 a 第一维的长度,也就是 “行数”,第二维的长度也就是 “列数”,则是为每一行单独声明的,因此创建的数组 a 是 “不定长数组”,其内存分配如图5.3所示。

image 2024 02 29 13 35 07 323
Figure 1. 图5.2 二维数组内存分配(第一种方式)
image 2024 02 29 13 35 39 058
Figure 2. 图5.3 二维数组内存分配(第二种方式)

声明的同时为数组分配内存

第二种创建方式与第一种实现的功能相同,只不过声明与赋值被合并到同一行代码中。例如,创建一个 2 行 4 列的二维数组,代码如下:

int a = new int[2][4]

初始化二维数组

二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。语法如下:

type arrayname[][] = {value1,value2,…,valuen};
  • type:数组数据类型。

  • arrayname:数组名称,一个合法的标识符。

  • value:二维数组中各元素,都代表一个一维数组。

初始化二维数组,代码如下:

int myarr[][] = {{12,0},{45,10}};

初始化二维数组后,要明确数组的下标都是从 0 开始的。例如,上面的代码中 myarr[1][1] 的值为 10。

int 型二维数组是以 int a [][] 来定义的,所以可以直接给 a[x][y] 赋值。例如,给 a[1] 的第 2 个元素赋值的语句如下:

a[1][1] = 20

使用二维数组

二维数组在实际应用中被用得非常广泛。下面的实例就是使用二维数组输出一个 3 行 4 列且所有元素都是 0 的矩阵。

【例5.2】输出一个 3 行 4 列且所有元素都为 0 的矩阵(实例位置:资源包\TM\sl\5\2)

在项目中创建 Matrix 类,在主方法中编写代码实现输出一个 3 行 4 列且所有元素都为 0 的矩阵。实例代码如下:

public class Matrix { // 创建类
	public static void main(String[] args) { // 主方法
		int a[][] = new int[3][4]; // 定义二维数组
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) { // 循环遍历数组中的每个元素
				System.out.print(a[i][j]); // 将数组中的元素输出
			}
			System.out.println(); // 输出空格
		}
	}
}

运行结果如下:

     0000
     0000
     0000

对于整型二维数组,创建成功之后系统会给数组中每个元素赋予初始值 0。

编程训练(答案位置:资源包\TM\sl\5\编程训练)

【训练3】模拟书柜放书 一个私人书柜有3层2列,分别向该书柜第1层第1列放入历史类读物,向该书柜第2层第1列放入经济类读物,向该书柜第2层第2列放入现代科学类读物。创建一个二维数组,并给该二维数组赋值。

【训练4】输出古诗 创建Poetry类,声明一个字符型二维数组,将古诗《春晓》的内容存储在这个二维数组中,然后分别用横版和竖版两种方式进行输出。