![Java编程从零开始学(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/137/29977137/b_29977137.jpg)
5.5 二维数组及其使用
现在,我们对一维数组的声明、初始化、赋值、使用、遍历都有了认识,也可以用一维数组来解决我们生活中的许多实际问题了,比如统计和处理班级某学科的学生成绩。可是还有一种情况,比如分别统计班级Java课程、数据库课程、操作系统课程的学生的总分。这时,更像是一张二维表格,一维数组似乎没有那么适合了。本节就让我们一起来认识一下二维数组!
5.5.1 二维数组的声明
一维数组的声明是一个[],二维数组是两个[],第一个[]看作存放的元素是一维数组,第二个[]存放的是基本数据类型。二维数组的定义方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P82_51873.jpg?sign=1738820515-w5AtEUBMrAazpOxpJUVQ2Of2eT0jOM1O-0-4a829d684139ad944e93be8bc8de8262)
其中,type表示数组的数据类型,也就是数组中元素的类型;array表示数组名声明一个简单的二维数组,存储整型元素,其定义方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P82_51874.jpg?sign=1738820515-5KCPcFw98s6g6Y3y5eOnqCMX8w9GfkGg-0-64164cb43081f26ce3ab907081d1e30e)
在上面的示例中,int用来标识数组中元素的类型,scores用来指代二维数组名,[][]表示该数组为二维数组。
5.5.2 二维数组的初始化
二维数组的初始化方式和一维数组的初始化方式类似,也是分为静态初始化、动态初始化、默认初始化3种方式。
1. 默认初始化
默认初始化是一次性创建所有的行和列,一般使用关键字new来完成。其基本方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P82_51875.jpg?sign=1738820515-57aDs9JGlTkA33j4ZB6gveW75ZYQklwa-0-793c7b9b1b9dbd96a2c51e0de7685450)
在上面的示例中,x标识这个数组的行数(相当于一维数组的数目),y标识这个数组的列数(一维数组中的元素个数)。比如:班上有10名学生,分别统计他们的Java课程、数据库课程、操作系统课程的成绩,就应该用一张3×10的表格去存储,用二维数组就可以表示为:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P82_51876.jpg?sign=1738820515-GirT8e2PodVxkHtmYw0H92xRzcQoXBr7-0-15e48379ee550e236cc9b8fdd918f776)
在上面的示例中定义了一个二维数组,其中数组元素的类型是int,数组名是scores,申请了一个3行10列的数组。
2. 动态初始化
动态初始化是先新建行的数目,再分别去新建列的数目,这样就可以实现二维数组的动态初始化。这样做的好处是可以根据情况创建不同的列数来节省空间,不用必须新建一个规则。其基本方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P82_51877.jpg?sign=1738820515-G8yOgDzqoBLy1Zsg6S5HbS2YOpuoMdnb-0-7bcb0a29eca52a4a92fba902b3c98463)
比如:小甜甜选修了三门课,小粉粉选修了四门课,要求统计他们的课程分数。现在有两种方案:
(1)我们可以按最大的行和列来申请数组,就是2×4,这样小甜甜就浪费了一个空间。
(2)我们可以用不规则的数组初始化方式来新建一个数组,第一行有3个元素,第二行有4个元素,其创建方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P83_51879.jpg?sign=1738820515-9JoSHsLAejWyivcK4sCSjX3Esx9N3O3U-0-b480473e7dd2479c3c91332e40d6dfea)
3. 静态初始化
静态初始化就是在创建二维数组的时候赋值。这种方式能够很直观地看到数组的定义和赋值情况,其基本定义方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P83_51880.jpg?sign=1738820515-8D8pVEx9bjfxVX85PL2hxZZHN8i88bGs-0-0aea51c3273040a8672145aa04a3feba)
比如:小甜甜选修了三门课,小粉粉选修了四门课,现在来统计他们的课程分数。使用静态初始化定义数组,如下所示:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P83_51881.jpg?sign=1738820515-7egudaANWz33WC7eRL8VKkLfBDCh1CIn-0-d5692d9510219589ef8fc1fb4f45c56e)
注意
没有new type[][x]这种写法,有new type[x][]这种写法。
上例中的二维数组的结构如图5.6所示。
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P84_10128.jpg?sign=1738820515-sbww95JtjHlgnzvZLVkvTgKHhDxYRnxz-0-7acb156dd07748c1a9c70d53518da02b)
图5.6 二维数组结构
5.5.3 二维数组的使用
二维数组的使用要分成两部分来理解:第一部分是二维数组中存放的一维数组,第二部分是一维数组中的元素值。第一个[]是用来索取一维数组的,第二个[]是用来索取一维数组中元素的。读取二维数组中的值的基本方式如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P84_51883.jpg?sign=1738820515-bELtRCiHw9w2axI1PdHBJqH5HlDQgjZZ-0-8d1b7a3ff8478db061b56a4e9648b55a)
二维数组本身可以看作一个数组,它存储的元素的类型是一维数组(行),一维数组中存储的元素是该行列的数量。所以我们遍历的时候的顺序应该是,先取得行,再去取得行中数据对应的列。其操作方式如示例5-8所示。
【示例5-8】遍历二维数组
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P84_51884.jpg?sign=1738820515-PMatFz6chRRtZwh9lr9TgsKjblzHl37J-0-240891f89ab7f591a2f70011eebff3a0)
程序编译后,运行结果如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P84_51885.jpg?sign=1738820515-iad3W7nc1IqiILWFWe56eAY0gAGpEMn5-0-c2ed2bfcf241ba4fb1840555b4131f7e)
使用增强for循环去遍历二维数组,如示例5-9所示。
【示例5-9】增强for循环遍历二维数组
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P85_51887.jpg?sign=1738820515-XR9d4DPcWAAfnaa1I1X12Y0q4YCiVrHN-0-586c52710da5716f799b5b721e4ed43e)
程序编译后,运行结果如下:
![](https://epubservercos.yuewen.com/96FD95/16499866704817306/epubprivate/OEBPS/Images/Figure-P85_51888.jpg?sign=1738820515-24YV64dAmfSnohLPGERwe0TqkikkTQSt-0-f420faf745fc238e7dc6dffc0426d8b9)
示例5-8和示例5-9展示了如何使用for循环来遍历二维数组,需要注意的是,增强for循环都是进行的赋值操作,并不是元素本身。