Java入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

4.3 二维数组

一维数组是表示一个线性顺序关系,正如队伍方阵中的一列或者一行。如果队伍有100个人,该怎么排列呢?排成一排吗?这显然不合理,肯定是多列多行来排列。当处理这类问题时,就需要用到二维数组了。

4.3.1 创建二维数组

二维数组常用于表示二维表,表中的信息以行和列的形式表示,它有2个下标,第1个下标代表元素所在的行,第2个下标代表元素所在的列。

二维数组可以看作是特殊的一维数组,它有两种声明方式:

二维数组声明实例:

     char myChars[][];
     int[][] myInts;

同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用关键字new来分配内存,然后才能访问每个数组元素。分配内存空间的语法格式如下:

     数组名= new 数组元素类型[行数][列数];

为二维数组分配内存空间有两种方式,一种是直接分配行列,如下:

另一种是先分配行,再分配列,如下:

综合上述创建二维数组并为其分配空间的过程,二维数组的声明语法格式如下:

     数组元素类型 数组名 = new 数组元素类型[行数][列数];

例如,下面声明一个三行两列的int型二维数组:

二维数组的两个[ ]方括号分别表示行和列。行号和列号用来确定一个元素,相当于一个面上的一点。二维数组中数据的分布如表4-1所示。

表4-1 二维数组中数据的分布

从表4-1中可见,二维数组中的数据如同坐标上的点一样,这样能更为方便地表示生活中的事物。

☆大牛提醒☆

创建二维数组时,可以只声明“行”的数量,而不声明“列”的数量,例如:

     int myInts[ ][ ]=new int[2][ ];

如果不声明“行”的数量,就是错误的写法,例如:

     int myInts[ ][ ]= new int[ ][ ];
     int myInts[ ][ ]= new int[ ][2];

4.3.2 二维数组的赋值

二维数组的初始化与一维数组类似,也有3种方式。但不同的是,二维数组有两个索引(下标),构成由行和列组成的一个矩阵。

第1种方式:

第2种方式:

第3种方式:

前两种是通过{ }中的元素来确定二维数组的行和列,所以不能在[][]中写行数和列数。可以发现,数组的每一行对应的是一个数组数据,就可以理解为一维数组的元素对应的是另一个一维数组。最后一种是先申请确定数组行列数,然后再在对应行列位置进行赋值。

当二维数组元素较多时,例如100行、100列的10000个数据,就可以通过for循环语句赋值,例如如下代码:

【例4.8】创建二维数组,使用for循环语句输出二维数组中的值(源代码\ch04\4.8.txt)。

运行结果如图4-12所示。创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过for循环语句将数组的所有元素显示出来。

图4-12 通过for循环语句输出数组元素

4.3.3 遍历二维数组

遍历二维数组需要使用双层for循环语句,而且通常需要使用length属性来获取数组的长度。对于二维数组中的元素值,我们可以直接使用行号和列号作为索引来访问。例如:

但是这样一个一个地写不但麻烦,而且程序代码也不够整洁,这时,我们就可以使用for循环语句来遍历二维数组元素。例如:

运行结果如图4-13所示。这里的二维数组是通过两层for循环语句输出的结果,其中外层for循环语句遍历的是数组的行数,内层for循环语句遍历的是每行的每一列元素。

图4-13 二维数组输出结果

☆大牛提醒☆

不能访问索引号大于或等于行数和列数的内容,该内容不属于该数组的内存空间,系统会报错。

另外,使用foreach循环语句也可以遍历二维数组的元素,并输出访问结果。

【例4.9】使用foreach循环语句遍历数组,并输出数组元素值(源代码\ch04\4.9.txt)。

运行结果如图4-14所示。这里创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过foreach循环语句将数组的所有元素显示出来。

图4-14 通过foreach循环语句输出数组元素

4.3.4 不规则数组

Java除了支持行、列固定的矩形方阵数组类型外,还支持不规则的数组。例如二维数组中,不同行的元素个数可以不同,例如:

这个不规则数组的内存空间分布如表4-2所示。

表4-2 不规则数组中数据的分布

【例4.10】使用不规则二维数组输出课程表信息。这里二维数组0行是星期,0列是节序,其余内容是课程名,没课的内容是空的(源代码\ch04\4.10.txt)。

运行结果如图4-15所示。

图4-15 课程表输出结果

☆大牛提醒☆

当不确定数组行列信息,就用length属性获取对应行列数进行遍历,以免访问非法地址。