如果需要在程序中存储一个班级里所有学生的身高信息该怎么办呢?最简单的办法就是声明多个变量,用每一个变量存储一个学生的身高值。这样做虽然能够存储数据,但其缺点也是显而易见的。多个变量其实就是一些零散的数据,从逻辑上无法体现出这些数据之间有任何关系,而从实际开发的角度来看,这组零散的数据又不便用统一的方式操作和管理。
为解决这个问题,Java以及很多其他高级编程语言都引入了数组的概念。数组专门用来存放一组数据,专业上,人们把数组中的数据称为“数组元素”,简称“元素”。Java语言中,数组中所有元素的类型都是统一的,并且这些元素在内存中的地址也是连续的。
同变量一样,在使用数组之前必须先要进行声明。声明一个数组的格式为:
数据类型[] 数组名;
或者
数据类型 数组名[];
在声明语句的格式中,方括号并不是数组名称的一部分,它只是用来表示所声明的不是普通变量,而是一个数组。例如希望声明一个能够存储int型数据的数组,并且把数组命名为array,就可以使用如下方式完成:
int[] array;
或者
int array[];
各位读者肯定会问:通过以上代码所声明的数组能存储多少个元素呢?其实,以上代码只是声明了数组的类型和名称,虚拟机还并没有为它分配存储空间,因此它还不能存储数据。专业上,给数组分配存储空间的操作称为“初始化”。对数组实现初始化操作可以使用new关键字完成,格式如下:
数组名 = new 数据类型[数组长度];
例如,对之前所声明的int型数组array进行初始化,就可以用以下代码实现:
array = new int[5];
这行代码表示要给array数组分配5块内存空间。当然,也可以在声明数组的同时完成初始化操作,例如:
int[] array = new int[5];
此处需要提醒各位读者:声明数组时,方括号中不能出现数字,否则会出现语法错误。只有在初始化数组时才能在方括号中写上数字,这个数字表示数组的长度。使用new关键字初始化数组的过程中,虚拟机其实完成了两件事情:1、为数组分配了存储空间。2、给每个元素设定了默认值。
那么,虚拟机给每个数组元素设定的默认值是多少呢?如果是数字类型的数组,虚拟机都以0作为每个数组元素的默认值,如果是char类型的数组,以编号为0的字符做为元素默认值,而对于boolean型数组,虚拟机则会把每个元素的默认值设为false。
如果程序员希望用一组已知的数据初始化一个数组,也可以通过以下格式完成:
数组名 = new 数据类型[]{元素1, 元素2, ...... 元素n};
例如:
array = new int[]{1,2,3,4,5};
通过这种方式初始化数组,不需要在方括号中指定数组的长度,虚拟机会根据大括号中元素的个数来为数组分配内存空间。如果在方括号中指定数组长度反而会出现语法错误。此外,虚拟机还会用大括号中列出的数据依次为每个数组元素赋值。
其实这种创建数组的写法还有一种简化格式,就是去掉“new 数据类型[]”,直接在一对大括号列出所有的数组元素即可,例如:
array = {1,2,3,4,5};
当初始化一个数组之后,就可以访问这个数组中的元素。Java语言是以下标的方式访问数组,格式为:
数组名称[下标]
例如把array数组中下标为1的元素赋值为2,就可以写成:
array[1] = 2;
需要提醒各位初学Java的读者,数组的下标都是从0开始的。也就是说,array数组中“头一个”元素是array[0]而不是array[1]。生活中,人们计数往往都是从1开始的,所以很多初学者都不理解为什么数组下标是从0开始。在此解释一下其中的原因:当给一个数组分配了空间之后,为了方便访问数组中的每一个元素,虚拟机会用数组名称给数组中第1块内存空间命名。例如,对array数组完成初始化之后,虚拟机就会把该数组中第1块内存空间命名为array。这块叫做array的内存空间是整个数组每一块内存空间的“参照物”。相对于这个参照物来讲,紧挨着它的那块内存空间的偏移量就是1。数组下标并不是用来标记内存空间的序号,而是用来指出数组中每一块内存空间(也可以理解为每一个元素)相对于参照物的偏移量。对于参照物自身而言,它相对于参照物的偏移量为0,因此数组中“头一个”元素的下标为0,第2个元素相对于参照物而言偏移量为1,因此它的下标就是1,以这种方式计算,数组中最后一个元素的下标就是:数组长度-1。如果下标值超出了0到数组长度-1的范围,称为“数组下标越界”,程序运行会出现错误。
很多读者都会问:如果不知道数组的具体长度,该如何访问最后一个数组元素呢?在Java语言中,数组也是一个对象,程序员可以通过length属性获得数组的长度,调用length属性的格式为:
数组名.length
例如,在控制台上输出array数组的长度可以用以下代码实现:
System.out.println(array.length);
当完成了数组的初始化之后,它的长度就已经固定下来,不能再增加或减少数组的长度。因此,对length属性重新赋值的操作都会引起语法错误。
数组在Java语言中使用的频率非常高,下面通过一个简单的例子来演示一下数组在Java语言中的实际应用。
【例03_01 求平均身高】
Exam03_01.java
- import java.util.Scanner;
- public class Exam03_01 {
- public static void main(String[] args) {
- double height[];// 用于存储身高值的数组,单位:米
- height = new double[3];// 初始化数组长度为3
- double avgHeight;// 平均身高
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入第1个人的身高");
- height[0] = sc.nextDouble();
- System.out.println("请输入第2个人的身高");
- height[1] = sc.nextDouble();
- System.out.println("请输入第3个人的身高");
- height[2] = sc.nextDouble();
- avgHeight = (height[0] + height[1] + height[2]) / 3;
- System.out.println("3个人的平均身高是:" + avgHeight + "米");
- }
- }
程序运行结果如图3-1所示:
图3-1 【例03_01】运行结果