17xie > Java语言实用教程 > 第4章 数组
背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-2606.html    注册17xie 一起来写书 实现您的出书梦想!

4  数组

内容提示:本章主要介绍了Java语言中数组的相关概念和用法,包括基本的一维数组、二维和二维以上多维数组的相关内容

4.1  数组的概念

数组(Array)是一组相同数据类型数据的有序集合。在Java语言中数组元素可以由简单数据类型组成也可以由对象组成。数组中的每个元素都具有相同的数据类型,可以用一个统一的数组名和一个下标来唯一地确定数组中的元素。

数组主要具有下面的特点:

l         数组是相同数据类型的元素的集合。

l         数组中的各元素是有先后顺序的,在内存中按照这个先后顺序连续存放在一起。

l         数组元素用整个数组的名字和其在数组中的顺序位置来表示。如a[0]表示名字为a的数组中的第一个元素,a[1]表示数组a中的第二个元素。

从数组的构成形式上看,可将其分为一维数组和多维数组。

4.2  一维数组

一维数组是最简单的数组,其逻辑结构是线性表。

4.2.1  一维数组的创建

一维数组声明的语法格式为:

数据类型 数组名[];      //声明一维数组

数组名=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

4.2.2  一维数组的应用

在定义数组的同时也可以为数组元素分配空间并赋值,这种赋值方法称为数组的静态内存分配方式。

语法格式为:

数据类型 数组名[]={初值表};

例如:

int score[]={1,2,3,4,5,6};

char spring[]={"","","",""};

在上面的语句中数组score是整型数组,虽然没有指明数组的长度,但由于大括号内有5个初始值,编译器就会依次指定score中各元素为:score[0]1score[1]2score[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次将98比较对调,第2次将第2个数和第3个数(96)对调……如此共进行5次,得到8-6-3-5-0-9的顺序,可以看到:最大的数9已经“沉底”,成为数列中最下面的一个数,而小的数“上升”。最小的数0已经向上“浮起”一个位置。经过第15次的排列后,已经得到最大的数。然后进行第2趟比较,对余下的前面5个数按照同样的方法再次进行比较,如图4-3所示。

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次两两比较。

 

 

 

 


字数:5531    最后更新:1年以前 [10-11 17:33]屈辰晨 修改
本页编辑者:屈辰晨  
[前一页]:第3章Java语言基础  [后一页]:4.3 多维数组
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号