二维数组
二维数组本质是一维数组的叠加,二维数组的所有元素都是引用类型,这些元素分别指向不同的一维数组,其内存结构和之前介绍的一维数组类似。例如,二维数组 arr 指向了由 arr[0]、arr[1]和 arr[2] 组成的数组,而 arr[0]、arr[1]和 arr[2] 自身也是一维数组。也就是说,arr[0]、arr[1]和 arr[2] 三者既是二维数组的数组元素,又各自是一个独立的一维数组,如果把地址看做钥匙,引用(可认为是变量名)可看做钥匙盒。
arr[0]、arr[1]和arr[2] 是二维数组的三个元素,这三个钥匙盒是并排的。
arr[0]、arr[1]和arr[2] 所引用的是三个独立的数组,由于 new 操作符总是开辟新的空间且无法保证连续,arr[0]、arr[1]和arr[2] 中的“钥匙”(即地址)不是连续的,如图所示。
二维数组的赋值和使用与一维数组类似,都是通过下标访问数组元素,不同的是一维数组只有一个下标,而二维数组有两个下标,分别表示该元素所在数组的行数和列数。例如 arr[0][3],其表示的是数组 arr 中第 1 行第 4 列的元素。
在声明并创建数组(int[][] arr = new int[3][4];)之后,可使用的数组下标范围为:arr[0][0]~arr[2][3],这一点和一维数组类似,需要注意数组下标越界的问题。
同一维数组一样,二维数组在创建的时候也可以初始化,例如:
int[][] arr1= {{2,3},{1,5},{3,9}};//初始化一个3行2列的整型二维数组
int[][] arr2= {{1,2,3},{1,5},{3,9}};//初始化一个3行的整型二维数组
其中,数组 arr2 第一行有 3 个元素,第二行和第三行都有 2 个元素,对于这类每行元素个数不同的二维数组,在使用时尤其需要注意数组下标越界的问题。
如何遍历二维数组?二维数组是二维的,是由“行”和“列”构成的。因此,只需要先遍历每一行,然后再遍历每一行中的每一列即可。其中的“行”,就是构成二维数组的元素:一维数组。遍历二维数组的伪代码如下所示。
//遍历二维数组的每一行
for (int i = 0; i < 二维数组.length; i++) {
//遍历每一行中的每一列
for (int j = 0; j < 二维数组[i].length; j++) {
//二维数组[i][j]
}
}