Java语言中,多维数组被看作数组的数组,多维数组的定义是通过对一维数组的嵌套来实现的。
多维数组中最常用的是二维数组。二维数组的声明方式与一维数组类似,内存的分配也是通过new运算符。
二维数组声明的语法格式为:
数据类型 数组名[][]; //声明二维数组
数组名=new 数据类型[行数][列数]; //分配内存给数组
与一维数组不同的是,二为数组在分配内存时,必须告诉编译器二维数组行与列的个数。
例如:
int a[][]; //声明整型二维数组a
a=new [2][3]; //分配内存给数组供2行3列的整型数组a使用
同样也可以在声明数组的同时给数组规定空间,将上面的两个语句合并为:
int a[][]=new int[2][3];
以上语句表示定义了2行3列的二维数组a,数组的每个元素为一个整数。数组中各元素通过其下标来区分,每个下标的最小值为0,最大值比行数或列数少1。数组a包括6个元素,分别是:a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],相当于一个m行n列的规则矩阵。
编译上面的语句后,内存的分配情况,如图4-4所示。
图4-4 规则矩阵的二维数组内存分配
需要注意的是由于Java语言把多维数组看作是数组的数组,所以并不要求多维数组中的每一维数组的大小都相同,也就是说Java的多维数组不一定是规则的矩阵形式。例如:
int x[][];
x=new [3][];
这两句代码表示数组x有3个元素,每个元素都是int类型的一维数组,相当于定义了3个数组变量,分别为:x[0][],x[1][],x[2][]。在这里可以把x[0],x[1],x[2]看作变量名,通过new运算符使其指向它们的数组对象,如:
x[0]=new int[3];
x[1]=new int[2];
由此可以看出,二维数组x的每行长度可以是不一样的。编译上面的语句后,内存的分配情况,如图4-5所示。
图4-5 不规则矩阵的二维数组内存分配
若要取得二维数组的行数,只要在数组名后加上“.length”属性即可,若要得到数组中某行元素的个数,则需要在数组名后加上该行的下标,再加上“.length”,例如:
a.length; //得到数组a的行数
a[0].length; //得到数组a的第1行元素个数
【例4-5】为二维数组的每个元素赋值并求和。
//********** ep4_5.java **********
class ep4_5{
public static void main(String args[]){
int a[][]; //声明二维数组
a=new int[5][10];
int sum=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
a[i][j]=i*10+j; //为数组每个元素赋值
sum+=a[i][j];
}
}
System.out.println("The sum is:"+sum);
}
}
运行结果:
The sum is:1225
同一维数组一样,在给二位数组创建空间时,若元素是基本类型,系统将按照默认规则赋初始值,如果元素类型为复合型,则所有元素为未赋值状态(null)。
二维数组也可以进行静态初始化,语法格式为:
数据类型 数组名[][]={{第1行初值表},{第2行初始值表},{……},{第n+1行初始值表}};
例如:
int a[][]={{1,2,3},{4,5,6}}; //2行3列的数组
char spring[][]={{"春"},{"夏","秋","冬"}}; //1行3列的数组
需要注意的是同一维数组一样,在声明二维数组时不能指定其长度,否则会出现错误。如:int a[2][3]={{1,2,3},{4,5,6}};
【例4-6】计算并输出杨辉三角形。
//********** ep4_6.java **********
class ep4_6{
public static void main(String args[]){
int i,j,level=7;
int Yang[][]=new int[level][]; //声明二维数组存放杨辉三角形
System.out.println("杨辉三角形");
for(i=0;i<Yang.length;i++){
Yang[i]=new int[i+1]; //定义二维数组的第i行有i+1列
}
Yang[0][0]=1; //第一个元素为1
for(i=1;i<Yang.length;i++){ //计算杨辉三角形
Yang[i][0]=1; //杨辉三角形左边都为1
Yang[i][Yang[i].length-1]=1; //杨辉三角形右边都为1
for(j=1;j<Yang[i].length-1;j++){
Yang[i][j]=Yang[i-1][j-1]+Yang[i-1][j];
}
}
for(i=0;i<Yang.length;i++){ //输出杨辉三角形
for(j=0;j<Yang[i].length;j++){
System.out.print(Yang[i][j]+" ");
}
System.out.println();
}
}
}
运行结果如图4-6所示:
图4-6 例4-6的运行结果
了解了二维数组,就会发现弱项提高数组的维数,只需要在声明数组的时候将其下标与中括号增加即可,所以三维数组的声明为int a[][][],四维数组的声明为int a[][][][],依此类推。
使用多维数组时,输入、输出的方式和一维、二维相同,但是每多一维,嵌套循环的层数就会增加一层。所以数组的维数越高,数组的复杂程度也就越高。
【例4-7】创建一个3×4×5的三维数组,用其下标乘积生成每个元素,显示这些乘积。
//********** ep4_7.java **********
class ep4_7{
public static void main(String args[]){
int a[][][]=new int[3][4][5];
int i,j,k;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
for(k=0;k<5;k++){
a[i][j][k]=i*j*k;
System.out.print(a[i][j][k]+" ");
}
System.out.println();
}
System.out.println();
}
}
}
运行结果如图4-7所示:
图4-7 例4-7的运行结果
4.1 数组对象的长度在数组对象创建之后,就______改变。数组元素的下标总是从______开始。
4.2 对于数组int[][]t={{1,2,3},{4,5,6}}来说,t.length等于______,t[0].length等于______。
4.3 已知数组a的定义为“int a[]={1,2,3,4,5};”,则a[2]=______,数组b的定义为“int b[]=new int[5];”,则b[2]=______,数组c的定义为“Object []c=new Object[5];”,则c[2]=______。
4.4 调用数组元素时,用______和______来唯一确定数组中的元素。
4.5 下列______语句有错误。
A. int []a; B. int []b=new int[10]; C. int c[]=new int[]; D. int d[]=null;
4.6 下列______语句有错误。
A. int a[][]=new int[5][5]; B. int [][]b=new int[5][5];
C. int []c[]=new int[5][5]; D. int [][]d=new int[5,5];
4.7 关于下面的程序,正确的结论是______。
public class ex4_7{
public static void main(String args[]){
int a[]=new int[5];
boolean b[]=new boolean[5];
System.out.print(a[1]);
System.out.println(b[2]);
}
}
A. 运行结果为0false B. 运行结果为1true
C. 程序无法通过编译 D. 可以通过编译但结果不确定
4.8 书写一个声明9行9列数组的语句______。
4.9 什么是数组?数组有哪些特点?Java中创建数组需要哪些步骤?如何访问数组的第一个元素?
4.10 编程计算10~20的整数的平方值,将结果保存在一个数组中。
4.11 编写一个程序使之从键盘读入10个整数存入整型数组a中,然后逆序输出这10个整数。
4.12 某人有5张3分和4张5分的邮票,请编写一个程序,计算由这些邮票中的1张或若干张可以得到多少种不同的邮资。