本章工作任务
对学员成绩排序、求最高分
显示商品名称
购物金额结算
字符逆序输出
求商品最低价格
向有序字符序列中插入字符
本章技能目标
掌握数组的基本用法
会应用数组解决简单问题
本章简介
在第 2 章中我们学习了不同的数据类型,如整型、字符型、浮点型等。这些数据类型操作的往往是单个的数据。有时候,需要对数据类型相同、用途相近的一组数据集中进行处理,如处理一个班级所有学员的考试成绩等。这种情况下,仅仅使用以前的数据类型处理会非常烦琐。因此本章将学习如何使用 Java 中的数组,用数组集中操作数据比使用多个变量操作数据便捷得多。
预习作业
提示:
请按以下步骤预习本章内容:
1. 阅读、学习本章内容。
2. 标注出本章看不懂或存在疑惑的部分。
3. 整理、记录学习中的问题。
4. 熟记本章的英文单词。
1.背诵英文单词
请在预习时找出下列单词在教材中的用法,了解它们的含义和发音。
(1) array [əˈreɪ]: n. 数组,阵列;排列,列阵;vt. 排列,部署;打扮。
(2) length [leŋkθ]:n. 长度,长;时间的长短。
(3) sort [sɔːrt]:n. 种类;方式;品质;[计](资料、数据的)分类,排序。
(4) maximum [ˈmæksɪməm]:n. [数] 极大,最大限度;最大量;adj. 最高的;最多的;最大极限的。
(5) minimum [ˈmɪnɪməm]: n. 最小值;最低限度;最小化;最小量;adj. 最小的;最低的。
(6) reference [ˈrefrəns]:n. 参考,参照;涉及,提及;vi. 引用。
(7) info [ˈɪnfoʊ]:n. 信息;情报。
(8) primitive [ˈprɪmətɪv]:adj. 原始的,远古的;简单的,粗糙的。
2.预习并回答以下问题
请阅读本章内容,在作业本上完成以下简答题。
(1) 数组的基本要素有哪些?
(2) 阅读代码,并写出运行结果。
public static void main(String [ ] args) { int [ ] scores = new int[]{60,70,98,90,76}; for (int i = 0; i < scores. length; i++) { System.out.printin (scores [i]); } }
3. 预习并完成编码题
(1) 编写并完成本章中所有示例代码。
(2) 请使用 Java 语言编写代码,完成以下功能。
使用数组和 for 循环实现:从键盘上接收五位学员的姓名,并输出第一位和最后一位学员的姓名。
技术内容
8.1 数组概述
8.1.1 为什么需要数组
问题:Java 考试结束后,老师给张浩分配了一项任务, 让他计算全班学员 ( 30 人)的平均分。
张浩想了一下,要计算平均分不难,首先要定义变量。可是班里有 30 个学员,就要定义 30 个变量。这么一想,就开始头疼了。不过没办法,师命难违。因此,他写出了下面的代码。
int score1 = 95; int score2 = 89; int score3 = 79; int score4 = 64; int score5 = 76; int score6 = 88; int score28 = 70; int score29 = 88; int score30 = 65; average = (score1+score2+score3+score4+score5+……+score30) /30
上面的代码缺陷很明显,首先是定义的变量的个数太多,如果存储 10000 个学员的成绩,难道真要定义 10000 个变量吗?这显然不可能,另外也不利于数据处理。例如,求所有成绩之和或最高分、输出所有成绩,就需要把所有的变量名都写出来,这显然不是一种好的方法。
Java 针对此类问题提供了有效的存储方式——数组。
8.1.2 Java 中的数组
在 Java 中,数组就是一个变量,用于将相同数据类型的数据存储在内存中。数组中的每一个数据元素都属于同一数据类型。例如,全班 30 个学员的成绩都是整型,就可以存储在一个整型数组里面。
在第 2 章中已经学过,声明一个变量就是在内存空间分配一块合适的空间,然后将数据存储在这个空间中。同样,数组就是在内存空间划出一串连续的空间,如图 8.1 所示。
图 8.1 内存中的 int 类型变量和 int 类型数组
了解了数组在内存中的存储方式,下面来看数组的基本要素。
标识符。首先,和变量一样,在计算机中,数组也要有一个名称,称为标识符,用于区分不同的数组。
数组元素。当给出了数组名称,即数组标识符后,要向数组中存放数据,这些数据就称为数组元素。
数组下标。在数组中,为了正确地得到数组的元素,需要对它们进行编号,这样计算机才能根据编号去存取,这个编号就称为数组下标。
元素类型。存储在数组中的数组元素应该是同一数据类型,如可以把学员的成绩存储在数组中,而每一个学员的成绩可以用整型变量存储,因此称它的元素类型是整型。
根据上面的分析,可以得到如图 8.2 所示的数组结构。
图 8.2 数组的基本结构
对于图 8.2, 做如下说明。
数组只有一个名称,即标识符,如 scores 。
数组元素在数组里顺序排列编号,该编号即为数组下标,它标明了元素在数组中的位置。第一个元素的编号规定为 0, 因此数组的下标依次为0、1、2、3、4等。
数组中的每个元素都可以通过下标来访问。由于元素是按顺序存储的,每个元素固定对应—个下标,因此可以通过下标快速地访问到每个元素。例如,scores[0] 指数组中的第一个元素 70, scores[1] 指数组中的第二个元素 100 。
数组的大小(长度)是数组可容纳元素的最大数量。定义一个数组的同时也定义了它的大小。如果数组已满但是还继续向数组中存储数据的话,程序就会出错,这称为数组越界。
例如,图 8.2 中数组下标最大为 3, 如果数组的下标超过此大小,程序就会因错误而终止。
8.2 如何使用数组
8.2.1 使用数组的步骤
前面已经学习了数组的基本结构,那么数组该如何使用呢?其实只需要 4 个步骤。
1.声明数组
在 Java 中,声明数组的语法如下。
语法:
数据类型[]数组名;
或者
数据类型 数组名[];
以上两种方式都可以声明一个数组,数组名可以是任意合法的变量名。
声明数组就是告诉计算机该数组中数据的类型是什么。例如:
int [] scores; //存储学员的成绩,类型为 int
double height [] ; //存储学员的身高,类型为 double.
String [] names; //存储学员的姓名,类型为 String
2.分配空间
虽然声明了数组,但并不会为数组元素分配内存空间,此时还不能使用数组。因此要为数组分配内存空间,这样数组的每一个元素才能对应一个存储单元。
简单地说,分配空间就是要告诉计算机在内存中分配一些连续的空间来存储数据。在 Java 中可以使用 new 关键字来给数组分配空间。
语法:
数组名 = new 数据类型[数组长度];
其中,数组长度就是数组中能存放的元素个数,显然应该为大于 0 的整数。例如:
scores = new int [30] ; //长度为 30 的 int 类型数组
height = new double [30] ; //长度为 30 的 double 类型数组
names = new String [30] ; //长度为 30 的 String 类型数组
可以将上面两个步骤合并,即在声明数组的同时就给它分配空间,语法如下。
语法:
数据类型[] 数组名= new 数据类型[数组长度];
例如:
int scores [] = new int [30]; //存储 30 个学员成绩
一旦声明了数组的大小就不能再修改,即数组的长度是固定的。例如,上面名称为 scores 的数组长度是 30, 假如发现有 31 个学员成绩需要存储,想把数组长度改为 31, 则不可以,只能重新声明新的数组。
3.赋值
分配空间后就可以向数组里放数据了。数组中的每一个元素都是通过下标来访问的,语法如下。
数组名[下标值];
例如,向 scores 数组中存放数据。
scores [0] = 89; scores [1] = 60; scores [2] = 70; ……
回想 8.1 节提出的问题,张浩要计算 30 位学员的平均分,也是这样一个一个地赋值,非常烦琐。仔细观察上面的代码,会发现数组的下标是规律变化的,即从 0 开始顺序递增,所以考虑用循环变量表示数组下标,从而利用循环给数组赋值。
Scanner input = new Scanner(System.in); for (int i = 0; i < 30; i++) { score [i] = input .nextInt () ; //从控制台接受键盘输入进行循环赋值 }
可见,运用循环大大简化了代码。
注意:在编写程序时,数组和循环往往结合在一起使用,可以大大简化代码,提高程序效率。通常,使用 for 循环遍历数组或者给数组元素赋值。
在 Java 中还提供了另外一种创建数组的方式,它将声明数组、分配空间和赋值合并完成,语法如下。
数据类型[]数组名={值 1, 值 2, 值 3,…… ,值 n};
例如,使用这种方式来创建 scores 数组。
int [] scores = {60,70,98,90,76}; //创建一个长度为 5 的数组 scores
同时,它也等价于下面的代码:
int [ ] scores = new int[]{60,70,98,90,76}; //[]里面必须为空
经验:值得注意的是,直接创建并赋值的方式一般在数组元素比较少的情况下使用。它必须一并完成,如下代码是不合法的。
int[] score; score = {60,70,98, 90,76}; //错误