
第6章Java基础语法(三):数组
在Java语言中,数组是一种最简单的复合数据类型(引用数据类型)。数组提供了一种将有关联的数据分组的方法。数组是有序数据的集合,数组中的每个元素都具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素。另外,数组还有一个重要特性,就是它的元素个数是固定不变的,这和我们后面要介绍的集合是有区别的。
数组有一维数组和多维数组之分。我们先来介绍一维数组。
6.1 数组的声明、生成和初始化
创建一个数组不是一个简单的过程,我们需要3个步骤:数组的声明、生成和初始化。
6.1.1 数组的声明
要创建一个数组,必须首先声明数组。通用的一维数组的声明格式如下:
type var-name[];
其中,type定义了数组的基本类型。基本类型决定了组成数组的每一个基本元素的数据类型。数组的基本类型分为基本类型和引用类型两种,它们的声明格式如下:
int intArray[]; //基本类型数组 Date dateArray[]; //引用类型数组
数组还有第二种声明格式,即:
type[] var-name;
其中,方括号紧跟在类型标识符type的后面,而不是跟在数组名的后面。
上述数组的两种声明方式等价,如下面的两个定义是等价的。
int intArray[]; int[] intArray;
6.1.2 数组的生成
尽管我们在上面声明了intArray是一个整型数组,但实际上还没有数组变量存在。为了使intArray数组成为物理上存在的整型数组,必须用运算符new来为其分配地址并且把它赋给intArray。运算符new是专门用来分配内存的运算符。
当运算符new被应用到一维数组时,它的一般形式如下:
array-var = new type[size];
其中,type指定要分配的数据类型,size指定数组中变量的个数,array-var是要分配内存的数组变量。也就是说,使用运算符new来为数组分配内存,必须指定数组元素的类型和数组元素的个数。用运算符new分配内存后,数组中的元素将会被自动初始化为默认值。另外,数组中的元素个数size是不能改变的,这和我们后面要介绍的集合是有区别的。
下面的例子分配了一个能容纳10个整型元素的内存空间并把它们和数组intArray联系起来。
intArray = new int[10];
通过这个语句的执行,数组intArray将会指向10个整数,而且数组中的所有元素将被初始化为零。
6.1.3 数组的初始化
让我们回顾一下上面的过程:获得一个数组的第一步,必须定义变量所需的类型;第二步,必须使用运算符new来为数组所要存储的数据分配内存,并把它们和数组变量联系起来。这时候数组中的元素将会被自动初始化为默认值。例如,整型数组中的所有元素将被初始化为零。
这样一来第三步就变得非常重要,也就是数组的初始化。一旦为数组分配了内存,就可以通过在方括号内指定下标来访问数组中特定的元素,并为它们赋初值。所有的数组下标都从零开始。例如,下面的语句将值2赋给数组intArray的第二个元素。
intArray [1] = 2;
下面的程序显示存储在下标为3的数组元素中的值。
System.out.println (intArray [3]);
我们再看一看引用类型数组的定义过程。
(1)声明。
String stringArray[];
(2)生成。
String stringArray=new String[3]; /*为数组中每个元素开辟引用空间*/
(3)初始化。
stringArray[0]=new String("How"); //为第一个数组元素开辟空间及赋初值 stringArray[1]=new String("are"); //为第二个数组元素开辟空间及赋初值 stringArray[2]=new String("you"); //为第三个数组元素开辟空间及赋初值
下面的实例演示了上述基本概念,其中定义的数组存储了每月的天数。
/* * 演示数组的使用 * */ package sample; public class MonthArrayTest1 { public static void main(String args[]) { int month_days[]; month_days = new int[12]; month_days[0] = 31; month_days[1] = 28; month_days[2] = 31; month_days[3] = 30; month_days[4] = 31; month_days[5] = 30; month_days[6] = 31; month_days[7] = 31; month_days[8] = 30; month_days[9] = 31; month_days[10] = 30; month_days[11] = 31; System.out.println("April has " + month_days[3] + " days."); } }
该程序的输出结果如下:
April has 30 days.
另外,数组定义的3个步骤可以合并为一步。数组的初始化(Array Initialize)就是包括在花括号之内用逗号分开的表达式列表,逗号分开了数组元素的值。Java会自动地分配一个足够大的空间来存储所指定的初始化元素的个数,而不必使用运算符new。
例如,上面的演示程序可以改进如下。
/* * 演示数组的使用 * */ package sample; class MonthArrayTest2 { public static void main(String args[]) { int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; System.out.println("April has " + month_days[3] + " days."); } }
当运行这个程序时,你会看到它和前一个程序的输出结果一样。