数组概述
在C语言的学习中,我们已经知道:数组是存储在一个连续的内存块中的元素集合。数组中的每个元素必须是相同的数据类型,并且通过索引进行区分。数组中的第一个元素的索引为0。
在Java中,创建数组有两个步骤:
- 声明一个对数组的引用;
- 使用new关键字初始化数组,并指定数组的大小。
在Java中,数据要么是基础数据类型的,要么是一个引用类型。而数组不是八种基础数据类型之一,所以数组是引用类型。所以,一个数组需要一个引用来访问它,并且需要new关键字来初始化。
要声明一个数组引用,可以用中括号。例如,如下的语句声明了一个对int类型数组的引用:
| int [] sums; |
在Java中,声明数组时,我们也可以将括号放在数组名后。例如:
| int sums []; |
这是为了保持对C和C++的兼容性。我们推荐将括号放在数组名前面,因为这样可以使用引用声明更清晰。
数组的大小在数组实例化时决定。将一个整数放在中括号中来指定数组的大小。例如,如下的语句将sums赋值为一个有20个元素的新数组:
| sums = new int[20]; |
我们可以声明一个数组类型的引用,并且在同一语句中初始化该数组对象。如下的语句声明了一个对double类型数组的引用temps,temps在同一语句中被赋值为一个新的有31个元素的double类型数组:
| double [] temps = new double[31]; |
数组对象是使用new关键字初始化的,在数组对象分配内存空间后,数组元素被初始化。
访问数组
数组中的元素通过用对该数组的一个引用、一个用于描述我们要访问数组哪一个元素的整型索引值来访问。数组的第一个元素的索引为0,第二元素的索引为1,依此类推。
例如,如下的语句声明了一个有20个整型元素的数组,并给分别给元素赋值,第一个元素是1,第二个元素是2,最后一个元素是191:
| int [] sums = new int[20]; sums[0] = 1; sums[1] = 2; sums[19] = 191; |
数组长度
如果数组sums的大小为20:
| int [] sums = int[20]; |
sums的最后一个元素的索引为19。如果使用索引20,虽然编译器会允许编译,但是它是无效的。数组的索引是从0开始的,最大索引值比数组的长度小1。
注:(数组名.length)是获取数组的长度
引用数组
java中有九种类型的数组:八种基础数据类型中每一种是一种数组类型、引用类型的数组类型。sums和temps数组就是基础数据类型数组的示例。我们可以声明任何引用类型的数组。例如,如下的语句声明了一个Employee类型的引用数组:
| Employee [] myCompany; |
这样,变量myCompany就可以指向任何Employee类型的引用数组。
如下的语句将一个新的有500个元素的Employee类型引用数组赋值给myCompany:
| myCompany = new Employee[500]; |
该数组有500个Employee类型的引用,每个都初始化为null。
数组myCompany中的元素可以和基础数据类型数组一样,通过索引来访问。
引用数据类型的操作同基本数据类型操作一样,通过索引访问。
在上述操作完成后,还要进行以下操作,上面只是声明了数组有多少引用,还没有实例化对象,所以,我们需要对每个元素进行实例化,如:
|
| myCompany[0] = new Employee(); |
|
数组初始化
在Java中,我们可以用一条语句声明一个数组引用,实例化一个数组,并且填充数组元素。这个过程称为数组初始化,它对创建一个包含已知数据的小数组是很有用的。
数组初始化程序在创建数组时,不需要使用new关键字。数组中的元素使用大括号列出,元素和元素之间用逗号分隔开。例如,如下的数组初始化程序创建了一个有五个int类型元素的数组:
| int [] odds = {1, 3, 5, 7, 9}; |
数组复制
因为数组的大小是固定的,所以在使用数组时,经常不得不创建一个更大或更小的数组,然后将已存在的数组的内容复制到新的数组中。我们可以编写一个for循环将一个数组的内容复制给另一个,也可以用System类中的静态方法arraycopy()。
arraycopy()方法的签名如下:
| public static void arraycopy(Object source, int sourcePos, Object destination, int destinationPos, int length) |
sourcePose指示要复制的源数组,而destinationPos指示要复制给哪个目标数组。length参数代表要复制的元素的数目。
多维数组
以上讨论的数组都是一维数组。在Java中,我们还可以创建多维的数组。与一维数组一样,多维数组也是对象,需要一个引用。该引用是在数据类型和变量名之间用多个中括号来声明的。例如,如下的语句声明了一个对一个二维int类型数组的引用:
| int [] [] sums; |
当初始化二维数组时,必须用两个int类型整数来指定行数和列数。例如,如下的语句将sums赋值为一个新的10X12个int类型元素的数组:
| sums = new int[10][12]; |
这个数组有120个int类型元素,因为在内存中有10个含有12个元素的int类型数组。引用sums指向一个大小为10的数组,每个数组又包含10个int类型的数组引用。10个int类型的数组引用中的每一个又指向一个有12个int类型元素的数组,所以该数组就有120个元素。
三维数组,和其他多维数组的声明方式是一样的。
Java文档工具javaDoc
Java语言一个独特且特别有用的功能就是javadoc工具,使用该工具,可以获取Java源代码中的注释,并生成HTML页面。这就鼓励开发者在代码中添加注释,因为产生的HTML网页可以让同事和其他需要了解一个类的人所用,并且不需要看实际的源代码。
Java SE API的文档就是使用javadoc工具生成的。该文档可以在Sun的网站http://java.sun.com/javase上找到。我们可以下载该文档,也可以在线浏览。
运行javadoc工具可以为每个类创建HTML页面,页面中包含有类的详细信息。类页面的信息包括类的继承层次、字段的摘要、构造器和方法,以及每个字段、构造器和方法的详细描述。
javadoc工具查找源代码中以如下格式出现的特殊注释:
| /** */ |
与类的通用信息有关的注释直接出现在类声明之前,而与类的字段、方法或构造器有关的注释直接出现在类成员声明之前。此外,我们还可以使用如下javadoc标记之一来表述特定类型的注释信息:
- @author:表示源代码的作者名称。
- @depracated:表示随着程序版本的提升,当前类成员已经过期,仅为了保证兼容性依然存在,以此告之开发者不应再用这个API。
- {@docRoot}:代表当前页面要输出到的针对于根目录的相对路径。
- @exception:被方法所用,列出抛出的异常。
- {@link 包.类#成员的链接文字}:创建一个对特定类成员的链接。
- {@linkplain 包.类#成员的链接文字}:如{@link}相同,但是用纯文本字体代替了代码字体。
- @param:用于描述方法的形式参数。
- @return:用于描述方法的返回值。
- @see:创建一个“参见”XX条目的链接,如类、方法、变量等。
- @since:描述成员存在或改变时的版本号。
- @serial、@serialField和@serialData:用于串行化用途。
- @throws:与@exception标记相同。
- {@value}:用于显示常量静态字段的值。
- @version:描述类的软件版本。
总结
本章内容总结如下:
- 数组是存储在连续内存块中的元素集合。数组的长度是固定的,一旦声明后就不能增长或缩小。数组的大小用数组的length属性来获得。
- 数组可以使用new关键字或者使用数组初始化器初始化。
javadoc工具可以产生包含类信息的HTML页面,该页面中包含在源代码中出现的任何javadoc注释。