内容提示:本章主要介绍了Java语言中数组的相关概念和用法,包括基本的一维数组、二维和二维以上多维数组的相关内容
。
数组(Array)是一组相同数据类型数据的有序集合。在Java语言中数组元素可以由简单数据类型组成也可以由对象组成。数组中的每个元素都具有相同的数据类型,可以用一个统一的数组名和一个下标来唯一地确定数组中的元素。
数组主要具有下面的特点:
l 数组是相同数据类型的元素的集合。
l 数组中的各元素是有先后顺序的,在内存中按照这个先后顺序连续存放在一起。
l 数组元素用整个数组的名字和其在数组中的顺序位置来表示。如a[0]表示名字为a的数组中的第一个元素,a[1]表示数组a中的第二个元素。
从数组的构成形式上看,可将其分为一维数组和多维数组。
一维数组是最简单的数组,其逻辑结构是线性表。
一维数组声明的语法格式为:
数据类型 数组名[]; //声明一维数组
数组名=new 数据类型[个数]; //分配内存给数组
其中“数据类型”可以是Java中任意的数据类型,包括简单数据类型和复合数据类型。“数组名”是数组的名称,其命名规则应与Java变量的命名规则相同。“[]”指明数组元素,一般放到数组名后面,但也可以放到数组名的前面。
由于Java语言在数组声明时不为数组元素分配内存,所以声明时“[]”中不需要指出数组中元素的个数(数组长度),但必需为数组分配内存空间后才可以使用。
分配内存时需要使用运算符new,“[个数]”是声明数组要存放多少个元素,所以在这里new运算符是通知编译器根据[ ]中的内容分配相应的一块空间供数组使用,这种内存空间分配的方式称为动态内存分配方式。例如要创建含10个元素的整型数组:
int score[];
score= new int[10];
也可以在声明数组的同时给数组规定空间,即将上面的两个语句合并为:
int score[]=new int[10];
一旦数组创建后,就有了固定长度的结构,数组中各元素通过下标来进行区分,下标可以是整型数或表达式,如a[1+x](x为整数),下标从0开始,下标最大值为数组元素的个数减1,如果下标超出范围,会产生“数组访问越界异常”的错误。当数组的元素类型为基本类型时,在创建数组存储空间时按照其默认值给各元素赋初值。在上面的例子中,对于score数组,10个元素的下标变量分别为score[0],score[1],…,score[9]。系统为该数组的10个元素分配空间,每个元素的初始值为0,如图4-1所示。
图4-1 数组元素在内存中的分配
对于每个数组都有一个属性length指明数组的长度,如a.length指出数组a所包含的元素个数。
【例4-1】声明一个长度为5,利用循环语句对数组元素赋值,逆序输出数组元素内容。
//********** ep4_1.java **********
class ep4_1{
public static void main(String args[]){
int i,a[];
a=new int[5]; //分配内存空间供整型数组使用
for(i=0;i<5;i++){
a[i]=i;
}
for(i=a.length-1;i>=0;i--){ //逆序输出数组元素
System.out.println("a["+i+"]="+a[i]);
}
System.out.println("数组a的长度为:"+a.length); //输出数组长度
}
}
运行结果:
a[4]=4
a[3]=3
a[2]=2
a[1]=1
a[0]=0
数组a的长度为:5
【例4-2】求5个学生的平均成绩。
//********** ep4_2.java **********
import java.io.*;
class ep4_2{
public static void main(String args[]){
int score[]=new int[5];
for(int i=0;i<5;i++){ //将5个成绩输入数组
System.out.print("请输入一个学生的成绩:");
try{
BufferedReader in=
new BufferedReader(new InputStreamReader(System.in));
String s=in.readLine();
score[i]=Integer.parseInt(s); //将成绩存入数组
}
catch(IOException e){}
}
int sum=0;
for(int i=0;i<5;i++){
sum+=score[i];
}
System.out.println("平均成绩为:"+sum/5);
}
}
运行结果:
请输入一个学生的成绩:100
请输入一个学生的成绩:99
请输入一个学生的成绩:98
请输入一个学生的成绩:97
请输入一个学生的成绩:96
平均成绩为:98
在定义数组的同时也可以为数组元素分配空间并赋值,这种赋值方法称为数组的静态内存分配方式。
语法格式为:
数据类型 数组名[]={初值表};
例如:
int score[]={1,2,3,4,5,6};
char spring[]={"春","夏","秋","冬"};
在上面的语句中数组score是整型数组,虽然没有指明数组的长度,但由于大括号内有5个初始值,编译器就会依次指定score中各元素为:score[0]为1,score[1]为2,…,score[5]为6。同样字符型数组spring被初始化为拥有四个元素,各元素分别为:spring[0]为春,spring[1]为夏,spring[2]为秋,spring[3]为冬。
需要注意的是无论采用何种方式定义数组,都不能在其声明时指定长度,如int score[5]在编译时将会提示错误。
【例4-3】利用数组输出每月包含的天数。
//********** ep4_3.java **********
class ep4_3{
public static void main(String args[]){
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
System.out.println("December has "+month_day[11]+" days。");
}
}
运行结果:
December has 31 days.
【例4-4】用起泡法对10个不同的数排序(由小到大)。
//********** ep4_4.java **********
class ep4_4{
public static void main(String args[]){
int a[]={5,8,6,3,2,16,18,28,58,96};
for(int i=0;i<a.length-1;i++){
for(int j=0;j<(a.length-1)-i;j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int p=0;p<a.length;p++){
System.out.print(a[p]+" ");
}
}
}
运行结果:
2 3 5 6 8 16 18 28 58 96
起泡法的解题思路是:将相邻的两个数进行比较,将小的数调到前面,如图4-2所示。
图4-2 第1趟相邻比较
图4-2中有6个数,第1次将9和8比较对调,第2次将第2个数和第3个数(9和6)对调……如此共进行5次,得到
图4-3 第2趟相邻比较
第2趟经过4次比较,得到次大的数8。如此进行下去,可以推知,对6个数要比较5趟,才能使6个数按照大小顺序排列,若有n个数,则需要进行n-1趟比较。在第1趟中要进行5次相邻两数的比较,在第2趟中要进行4次比较……第5趟进行1次比较,若有n个数第1趟比较要进行n-1次两两比较,在第i趟比较中要进行n-i次两两比较。