一维数组使用数组名与一个索引值来指定存取数组元素,您也可以宣告二维数组,二维数组使用数组名与两个索引值来指定存取数组元素,其宣告方式与一维 数组类似:
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
从上面这个程序片段来看,就可以清楚的看出二维数组的索引方式,您宣告了2列(Row)3行(Column)的数组,您可以使用{ }与适当的断行协助您指定数组初值,下面这个程序简单的示范二维数组的存取:
public class TwoDimArray { public static void main(String[] args) { int[][] arr = {{1, 2, 3}, {4, 5, 6}}; for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[0].length; j++) System.out.print(arr[i][j] + " "); System.out.println(); } } }?
执行结果:
1 2 3 4 5 6
在使用二维数组对象时,注意length所代表的长度,数组名直接加上length,所指的是有几列(Row),而使用索引加上length,指的是该列所拥有的元素,也就是行(Column)数目,要了解为何是这样,必须从对象配置的角度来说明。
以对象的方式来配置一个二维数组对象,您使用以下的语法:
int[][] arr = new int[2][3];
上面这个程序片段中,您配置了2列3行的二维数组对象,由于数据型态是int,所以数组元素的预设元素为0,事实上这样的语法是Java为了程序设计人员使用上的方便所设计的,来细究配置的细节。
在上面的程序片段中,其实arr[0]、arr[1]是两个一维数组对象,其长度为3,而arr的型态为int[][],内容值为arr[0]与arr[1],其关系如下:
从上图中您可以看到,arr名称参考至int[][]型态的对象,而arr[0]与arr[1]再分别参考至一个一维数组对象,所以这也就是为何上面的程序中,使 用的length所表示的长度意义,您也可以知道,在Java中,一个二维数组的配置,各个元素的内存位置并不是连续的。
同样的道理,您也可以宣告三维以上的数组,如果要宣告同时初始元素值,可以使用以下的语法:
int[][][] arr = { {{1, 2, 3}, {4, 5, 6}}, {{7, 8, 9}, {10, 11, 12}} };
上面这个程序片段所宣告的三维数组是2x2x3,您将之想为两面2x3二维数组交迭在一起就是了,每一面的元素如下:
第一面
1 2 3
4 5 6
第二面
7
8 9
10 11 12
您也可以藉由立方体的(x, y, z)关系来标示三个索引值的关系,也就是列、行与高。
如果要动态宣告三维数组,就使用以下的语法:
int[][][] arr = new int[2][2][3];
多维以上的数组在Java中也是可行的,但并不建议使用,使用多维数组会让元素索引的指定更加困难,此时适当的将数据加以分割,或是使用其它的数据结构来解决,会比直接宣告多维数组来得实在。
由以上的说明,接下来讨论一个进阶议题:不规则数组。数组的维度不一定要是四四方方的,您也可以制作一个二维数组,而每个维度的长度并不相同,例如:
public class TwoDimArray { public static void main(String[] args) { int arr[][]; arr = new int[2][]; arr[0] = new int[3]; arr[1] = new int[5]; for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[i].length; j++) arr[i][j] = j + 1; } for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[i].length; j++) System.out.print(arr[i][j] + " "); System.out.println(); } } }
执行结果:
1 2 3 1 2 3 4 5?
这个例子只是上面的说明之观念延伸,在这个例子中,数组第一列的长度是3,而第二列的长度是5。