ITEEDU

Java Gossip: 一维数组对象

您现在要整理全班的程序设计小考成绩,您希望写个小程序,全班共有40名学生,所以您必须有40个变量来储存学生的成绩,现在问题来了,根据之前学过的,难道您要宣告40个名称不同的变量来储存学生的成绩数据吗?

当然您知道不会这么麻烦的,Java提供「数组」(Array)让您可以宣告一个以「索引」(Index)作为识别的数据结构,在Java中可以这么宣告一个数组并初始数组内容:

int[] score = {90, 85, 55, 94, 77}; 

上面这个程序片段宣告了一个score数组,它的内容包括90、85、55、94与77这五个元素,我们要存取数组时,必须使用索引来指定存取数组中的哪个元素,在Java中,数组的索引是由0开始,也就是说索引0的位置储存90、索引1的位置储存85、索引2的位置储存55,依此类推。

下面这个程序可以让您使用for循环来取出数组中的元素值:

ScoreArray.java
public class ScoreArray {
	public static void main(String[] args) {
		int[] score = {90, 85, 55, 94, 77};
		for(int i = 0; i < score.length; i++)
		System.out.print(score[i] + " ");
		System.out.println();
	}
}

执行结果:

90 85 55 94 77?

在存取数组元素时,必须注意到所指定的索引值不可超出数组范围,例如在上例中,我们不可以存取超过4的索引值,否则会发生ArrayIndexOutOfBoundsException例外。

在这个程序中,您使用了length这个属性成员,这边涉及到一个观念,在Java中,数组是一个对象,而不是单纯的数据集合,当您宣告一个数组时,其实就是在配置一个数组对象,上面的程序只是数组宣告与初始化成员的一个简易宣告方式,数组对象的length属性成员可以取回这个数组的长度,也就是元素个数。

其实在Java中,对象都是以new来配置内存空间,数组的使用也不例外,一个完整的数组宣告方式如下所示:

int[] arr = new int[10]; 

在上面的宣告中,会为arr配置10个整数的数组元素,索引为0到9,初始值预设为0,在Java中配置数组之后,若还没有指定初值,则依数据型态的不同,会预设有不同的初值,如下所示:

数据型态 初值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
boolean false

下面这个程序使用配置的语法来宣告数组,并使用循环来设定其值及显示:

BasicArray.java
public class BasicArray {
	public static void main(String[] args) {
		int arr[] = new int[10];
		System.out.print("Array值: ");
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
			arr[i] = i;
		}
		System.out.print("\n\nArray值: ");
		for(int i = 0; i < arr.length; i++)
		System.out.print(arr[i] + " ");
		System.out.println();
	}
}

执行结果:

Array值: 0 0 0 0 0 0 0 0 0 0 

Array值: 0 1 2 3 4 5 6 7 8 9 

由于数组的内存空间是使用new配置而来,这意味着您也可以使用动态的方式来宣告数组长度,而不用在程序中事先决定数组大小,例如:

CustomArrayLength.java

import java.util.Scanner;
public class CustomArrayLength {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入Array大小: ");
		int length = scanner.nextInt();
		int[] arr = new int[length];?// 动态配置长度
		System.out.println("Array长度: " + arr.length);
		System.out.print("内容: ");
		for(int i = 0; i < arr.length; i++)
		System.out.print(arr[i] + " ");
		System.out.println();
	}
}

执行结果:

请输入Array大小: 20 
Array长度: 20 
内容: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

在上面的程序中,您先宣告一个数组名arr,使用int[] arr表示这个名称将参考至一个一维数组对象,您也可以使用int[] arr,这两种宣告方式都是可以接受的,在使用者输入指定长度后,您使用这个长度来配置数组对象,并将这个数组对象指定给arr来参考。

数组的索引值由0开始并不是没有原因的,事实上索引值表示所指定的数组元素相对于数组第一个元素内存位置的位移量(Offset),位移量为0,自然就是指第一个元素,而索引9就是指相对于第一个元素的位移量为9。在Java中您不直接处理关于内存地址的操作,以上的观念是让您更了解一些数组索引的运作原理。