![Java入门很轻松(微课超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/857/44509857/b_44509857.jpg)
4.3 二维数组
一维数组是表示一个线性顺序关系,正如队伍方阵中的一列或者一行。如果队伍有100个人,该怎么排列呢?排成一排吗?这显然不合理,肯定是多列多行来排列。当处理这类问题时,就需要用到二维数组了。
4.3.1 创建二维数组
二维数组常用于表示二维表,表中的信息以行和列的形式表示,它有2个下标,第1个下标代表元素所在的行,第2个下标代表元素所在的列。
二维数组可以看作是特殊的一维数组,它有两种声明方式:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P81_50134.jpg?sign=1738893111-ME2hcCNxbWbh0ulzF7qJ0gESP8CJSgW8-0-8a649e0ee42c67d07086d38715e1c4d6)
二维数组声明实例:
char myChars[][]; int[][] myInts;
同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用关键字new来分配内存,然后才能访问每个数组元素。分配内存空间的语法格式如下:
数组名= new 数组元素类型[行数][列数];
为二维数组分配内存空间有两种方式,一种是直接分配行列,如下:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P81_50136.jpg?sign=1738893111-wSE0kSzrF7di6ubbxiCPsDi63iJaUTaJ-0-cd19ea1b58a4da0bd42826d95c47780f)
另一种是先分配行,再分配列,如下:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P81_50137.jpg?sign=1738893111-kaR5B4SiiXEBD89CwZOm1I4kHrSOVmwh-0-853e2276b860b85c64e276afa6e81bbc)
综合上述创建二维数组并为其分配空间的过程,二维数组的声明语法格式如下:
数组元素类型 数组名 = new 数组元素类型[行数][列数];
例如,下面声明一个三行两列的int型二维数组:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P81_50138.jpg?sign=1738893111-hpOeSncntiJAiAaqbGfss5a9XoM6J9xH-0-c73c6b7b09b8c311f296b229d9c815a3)
二维数组的两个[ ]方括号分别表示行和列。行号和列号用来确定一个元素,相当于一个面上的一点。二维数组中数据的分布如表4-1所示。
表4-1 二维数组中数据的分布
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-T81_50141.jpg?sign=1738893111-GGxiUvGhSUJKaYSrW0d4m48xtcqQ8kLB-0-dffa78e96bdf4351c067c43f5158b6d6)
从表4-1中可见,二维数组中的数据如同坐标上的点一样,这样能更为方便地表示生活中的事物。
☆大牛提醒☆
创建二维数组时,可以只声明“行”的数量,而不声明“列”的数量,例如:
int myInts[ ][ ]=new int[2][ ];
如果不声明“行”的数量,就是错误的写法,例如:
int myInts[ ][ ]= new int[ ][ ]; int myInts[ ][ ]= new int[ ][2];
4.3.2 二维数组的赋值
二维数组的初始化与一维数组类似,也有3种方式。但不同的是,二维数组有两个索引(下标),构成由行和列组成的一个矩阵。
第1种方式:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P82_50129.jpg?sign=1738893111-BQrvUYuzHVgjAjYuqUgmfYWjBYX5Vma9-0-a9aa9789193db600b2cc4618bb7c41b4)
第2种方式:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P82_50130.jpg?sign=1738893111-i5kIcMQ0ctAJNv4cHWRHZYcaWDSfoQ5z-0-d2e42f84ddc241c80bde0351a3737ff3)
第3种方式:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P82_50131.jpg?sign=1738893111-tumenPMpefWkeKxgzpph3KJ0E7L5qiFd-0-773253d7b6bf68fdb26ae8115031f0cd)
前两种是通过{ }中的元素来确定二维数组的行和列,所以不能在[][]中写行数和列数。可以发现,数组的每一行对应的是一个数组数据,就可以理解为一维数组的元素对应的是另一个一维数组。最后一种是先申请确定数组行列数,然后再在对应行列位置进行赋值。
当二维数组元素较多时,例如100行、100列的10000个数据,就可以通过for循环语句赋值,例如如下代码:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P82_50132.jpg?sign=1738893111-T2ByDhmrojcO2OPA0SUjuubRCJJ4F0Pl-0-17f1effe040c7009b8e0f0fcf93922fc)
【例4.8】创建二维数组,使用for循环语句输出二维数组中的值(源代码\ch04\4.8.txt)。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P82_50133.jpg?sign=1738893111-gJcnNN9BO2qXxGVMyDS8hrJHSFy70PbC-0-60826f0399e0637bbe189e1013d54df2)
运行结果如图4-12所示。创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过for循环语句将数组的所有元素显示出来。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P83_10774.jpg?sign=1738893111-IYtlAGckDAabnwbuqGLhUuBP55KYNWiF-0-7618607c19e1e35130801a3b0487b45e)
图4-12 通过for循环语句输出数组元素
4.3.3 遍历二维数组
遍历二维数组需要使用双层for循环语句,而且通常需要使用length属性来获取数组的长度。对于二维数组中的元素值,我们可以直接使用行号和列号作为索引来访问。例如:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P83_50127.jpg?sign=1738893111-s7gqNqAQroRYPunMlstrffi9VbHV92ho-0-33caa0d31acdac86a617705f0135f8f5)
但是这样一个一个地写不但麻烦,而且程序代码也不够整洁,这时,我们就可以使用for循环语句来遍历二维数组元素。例如:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P83_50126.jpg?sign=1738893111-YgUbkeRYuLggBuapSj7bHcSsrBSzqHEw-0-24a3ac8a91d1508cd841ee223b626a1f)
运行结果如图4-13所示。这里的二维数组是通过两层for循环语句输出的结果,其中外层for循环语句遍历的是数组的行数,内层for循环语句遍历的是每行的每一列元素。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P83_10858.jpg?sign=1738893111-OGxcfS0woJ2sSI4TekOooJ0Dg2crVeER-0-b7ff5656202b0d332eda84b79612f372)
图4-13 二维数组输出结果
☆大牛提醒☆
不能访问索引号大于或等于行数和列数的内容,该内容不属于该数组的内存空间,系统会报错。
另外,使用foreach循环语句也可以遍历二维数组的元素,并输出访问结果。
【例4.9】使用foreach循环语句遍历数组,并输出数组元素值(源代码\ch04\4.9.txt)。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P83_50123.jpg?sign=1738893111-ZfFyPjAo1s1PjW8jxGAf5hbqcXsdgZeE-0-bbb8c5ba59486b18cc24898b13a7be24)
运行结果如图4-14所示。这里创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过foreach循环语句将数组的所有元素显示出来。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P84_11002.jpg?sign=1738893111-8EjQf7T9u5DmleOQOyB5WPNUHRVAov7r-0-a8857771611d8f3f029326906a91c8b5)
图4-14 通过foreach循环语句输出数组元素
4.3.4 不规则数组
Java除了支持行、列固定的矩形方阵数组类型外,还支持不规则的数组。例如二维数组中,不同行的元素个数可以不同,例如:
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P84_50118.jpg?sign=1738893111-jLY822zov1OcljSeq8vKIIXHRPuIlBgx-0-5ca37c018a283c5c09af447ffa5480e4)
这个不规则数组的内存空间分布如表4-2所示。
表4-2 不规则数组中数据的分布
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-T84_50121.jpg?sign=1738893111-vItZDhMgTIJVggpJVCvi8hs5k9HZUjxe-0-366123973529f649c0cf055f1a9a063b)
【例4.10】使用不规则二维数组输出课程表信息。这里二维数组0行是星期,0列是节序,其余内容是课程名,没课的内容是空的(源代码\ch04\4.10.txt)。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P84_50122.jpg?sign=1738893111-r7xOjqKByLu5J3QLpaKckcSHWMBmqmDX-0-289b7c4d9e4837137c9bfb7cdb4a13ce)
运行结果如图4-15所示。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P85_11359.jpg?sign=1738893111-7JcPe3o2L8lJwttrNuLmV8iW8UioDAgu-0-05283d4fc3d72cba0df638e156ff3ae9)
图4-15 课程表输出结果
☆大牛提醒☆
当不确定数组行列信息,就用length属性获取对应行列数进行遍历,以免访问非法地址。