2.6 数组
本章前面介绍的整数类型、浮点类型、字符类型、布尔类型都属于基本数据类型,基本类型的值就是一个数字,一个字符或一个布尔值。而在实际应用中,经常需要处理具有相同性质的一批数据,例如,要处理一个班级学生的成绩,如果使用基本数据类型,就需要许多个变量,这样极为不便。为了方便处理一组具有相同性质的数据,在Java中引入了数组的概念。Java中的数组的定义和传统语言类似,数组是相同类型变量的顺序集合,在这个集合中的特定变量要使用共同的名字和变量在集合中的顺序下标来访问。
数组可以按照其中的变量类型被定义为各种类型,可以是复杂类型也可以是基本数据类型,在这里将以基本类型为例,但是这些用法将同样适用于复杂类型。数组中的每个元素通过数组名和数组下标唯一地确定,下标从0开始排序,如果一个数组的长度为5,则各元素的序号为0~4。
Java中的数组同样可以是一维或多维,数组提供了一种将有顺序关系的信息分组和引用的便利方法,其经常和循环控制语句结合使用完成相关的逻辑操作。
2.6.1 一维数组
数组同其他变量一样,在使用数组之前必须首先声明它。声明一个数组就是要确定数组的名称、数组元素的数据类型和数组的维数。
一维数组声明的格式如下:
Type arrayName[ ];
或
Type[ ] arrayName;
其中,Type:是数组的类型,也就是该数组内包含的变量的类型,既可以是基本类型,也可以是复杂类型。arrayName表示数组名称,可以是任意合法的标识符。[]表明定义的是一维数组而不是普通的变量,其可以紧跟在类型声明之后也可以跟在数组名称之后,第一种方式是为了照顾C程序员的习惯,而第二种方式是Java语言建议使用的格式。
一维数组声明的示例代码如下:
int[] nums; //声明了一个int类型的一维数组,数组的名称为nums String[] useNames; //声明了一个String类型的一维数组,数组的名称为userNames float totals[]; //声明了一个float类型的一维数组,数组的名称为totals
Java在数组声明的时候,并不为数组元素分配内存,因此[ ]中不用指出元素的个数,即数组长度,而且数组声明之后,还不能访问任何元素,否则程序编译的时候就会出现错误。因为数组在声明之后,必须经过数组初始化,才能引用数组中的元素。
数组的初始化可以通过给元素赋初值进行,也可以通过new操作符完成。
通过直接给元素赋初值从而为一维数组初始化的格式如下:
Type arrayName[ ]={element1[,element2,…]};
其中,Type表示数据类型,arrayName表示数组名称,element1、element2……表示Type类型的数组元素初始值,方括号表示可选项。
这种格式是在声明数组的同时进行,所赋初值的个数决定数组元素的数目,适合于元素个数不多的情况。
该格式初始化语句的示例代码如下:
int intArray[]={1,2,3,4};
该语句定义一个含有4个元素的int型数组并为之赋初值,系统为其分配存储空间,并且4个元素的初始值分别为1、2、3、4,初始化之后的内存存放形式如图2.3所示。
另外,还可以通过new操作符对数组进行初始化,其格式如下:
Type arrayName=new Type[arraySize];
其中,Type表示数据类型,arrayName表示数组名称,arraySize指明数组的大小。
这种格式既可以在声明数组的同时进行,也可以先声明数组,然后再初始化,适合于元素个数较多的情况。
该格式初始化语句的示例代码如下:
int intArray[]; //声明一个int型数组intArray intArray = new int[4]; //给数组分配4个int型数据空间,并初始化为0
或者
int intArrayName[]=new int[4];//声明并初始化数组
数组初始化后,系统为其分配4个int型数据空间,用于存储5个数组元素,int类型数组初始化后,数组元素的默认值为0。初始化之后的内存存放形式如图2.4所示。
图2.3 数组元素在内存中的存放形式
图2.4 数组元素在内存中的存放形式
当定义了一个数组,并对其进行初始化并分配了内存空间后,就可以引用数组中的元素了。
数组元素的引用方式为:
arrayName[index];
其中,index为数组下标,它可以为整型常数或表达式,下标从0开始,一直到数组的长度减1。以下都是合法的数组引用格式:
a[3],b[i],c[6*j]
【实例2-11】一维数组的使用。
01 public class Example19{ 02 public static void main(String args[]){ 03 float score[]={41.0f,82.5f,69.0f,94.5f}; //赋初值初始化数组 04 int rank[]; //声明数组 05 rank=new int[4]; //数组长度为4 06 rank[0]=4; //数组中的第一个数,数组下标为0 07 rank[1]=2; 08 rank[2]=3; 09 rank[3]=1; //数组中的第四个数,数组下标为3 10 for(int i=0;i<4;i++){ 11 System.out.println("Ascore["+i+"]="+score[i]+""+"rank["+i+"]="+rank[i]); 12 } 13 } 14 }
【代码说明】在实例2-11定义的类中的第3行声明一个float类型的数组score,并且通过赋初值初始化数组,使数组的4个元素score[0]、score[1]、score[2]、score[3]的值分别为41.0,82.5,69.0,94.5,第4行又声明一个一维数组rank,并在第5行通过new操作符初始化数组,指定数组的长度为4,初始化数组后分别在第6~9行给每个元素赋值,最后通过第10~12行的for循环输出两个数组中的每个元素的值。
2.6.2 多维数组
日常中涉及到的许多数据是由若干行和若干列组成的,为了处理这一类数据,在Java中可以使用多维数组,即每个元素需要两个或多个下标来描述的数组。多维数组可以看做数组的数组,即高维数组的每一个元素为一个低维数组,多维数组和一维数组一样在使用前也必须对其进行声明和初始化,并且声明和初始化的方法与一维数组类似。下面我们以二维数组为例,介绍多维数组的具体应用。
二维数组的声明格式如下;
Type arrayName[ ][ ];
或者:
Type[ ][ ] arrayName;
二维数组的声明方式与一维数组类似,只是要多加一对方括号。而且声明二维数组也不需要为数组元素分配内存,因此[ ]中不用指出数组长度。
声明一个二维数组仅为数组指定了数组名和数组元素的类型,并未指定数组的行数和列数,因此,系统无法为数组分配存储空间。与一维数组类似,我们也需要对二维数组进行初始化。二维数组的初始化也有两种方式:
Type[ ][ ] arrayName={{初值表},{初值表},…,{初值表}};
其中,Type表示数据类型,arrayName表示数组名称,初值表是用逗号隔开的初始值列表。
该格式初始化语句的示例代码如下:
int score[ ][ ]={{1,2},{3,4,5},{1,2,3,4}}
该语句声明了一个3行4列的二维数组,初始值由3个初值表组成,并且第3个初值表中包含4个元素,虽然前面两个初值表中的元素分别只有2个和3个,但是这里必须以长度最长的初值表为准,不足的以0填充。初始化之后的二维数组内存存放形式如图2.5所示。
图2.5 二维数组元素在内存中的存放形式
另外,也还可以通过new操作符对二维数组进行初始化,其格式如下:
Type[][] arrayName=new Type[length1] [length2];
其中,Type为数组元素的类型,arrayName为数组的声明的名字,length1指明数组的行数,length2指明数组的列数。
该格式初始化语句的示例代码如下:
int intArrayName[ ][ ]=new int[3][3];
二维数组元素的引用方式与一维数组的也基本类似,格式为:
arrayName[index1] [index2];
其中,index1为数组行下标,index2为数组列下标,它可以为整型常数或表达式,每个下标的最小值为0,最大值分别比行数和列数小1。以下都是合法的二维数组引用格式:
a[1][1],b[i][j]
【实例2-12】二维数组的使用。
01 public class Example21{ 02 public static void main(String args[]){ 03 int i,j; 04 int intArray[][]; 05 intArray=new int[3][3]; //声明二维数组对象 06 for(i=0;i<3;i++) //给二维数组的每个元素赋值 07 for(j=0;j<3;j++) 08 intArray[i][j]=i+j; 09 for(i=0;i<3;i++) 10 { 11 for(j=0;j<3;j++) //输出二维数组每个元素的值 12 System.out.print(intArray[i][j]+" "); 13 System.out.println(); 14 } 15 } 16 }
【代码说明】在实例2-12定义的类中的第4行声明一个二维数组intArray,并在第5行对其进行实例化,然后通过第6~8行的二重for循环语句对二维数组中的每个元素进行赋值。最后通过第9~14行的二重for循环语句遍历访问并输出二维数组中的每个元素的值。