
5.4 认识一维数组
现在,我们已经学会了基本类型数组的声明、初始化。数组除了可以按数据类型来进行分类外,还可以按照数组的维数来进行分类,比如一维数组(类似一个数轴)、二维数组(类似一个表格)等。
5.4.1 什么是一维数组
其实,我们前面学习的数组的声明、初始化所使用的例子都属于一维数组的范畴。所以,一维数组的声明形式、初始化形式都和我们前面讲解的方式一致。
一维数组在内存中的结构是一条连续的内存空间。内存结构对应着逻辑结构,我们所使用到的一维数组也是线性的,如图5.4所示。

图5.4 一维数组的内存顺序与逻辑顺序的关系
5.4.2 一维数组的使用及遍历
前面已经学会了一维数组的声明、赋值,并了解了它的物理顺序和逻辑顺序之间的关系,那么一维数组应该如何使用呢?怎么去取得其中的元素呢?怎么去遍历一维数组的所有元素呢?
我们通过图5.1了解了一维数组的物理顺序和逻辑顺序,其中指出了数组第一个元素的下标值是0,所以可以通过以下形式去获得一个数组中某个位置的值:

其中,array表示数组名,index表示数组的下标值。其使用方式如示例5-2所示。
【示例5-2】输出数组中的元素

程序编译后,运行结果如下:

如果需要修改数组中某个位置的元素值,也可以通过示例5-3所示的方式来进行操作。
【示例5-3】修改数组中某个位置的元素值

程序编译后,运行结果如下:

数组的下标是从0开始的,所以最大下标值是数组的长度减去1。如果下标在这个区间之外,就会抛出java.lang.ArrayIndexOutOfBoundsException异常,如示例5-4所示。
【示例5-4】数组下标越界

程序编译后,运行结果如下:

通过示例5-4可以看出,在访问数组中的第4个元素(下标为3)时,数组下标发生越界。因为数组中只有3个数值,无法提供第4个数值的访问,所以程序抛出了数组越界的异常。
在进行数组操作时,经常要做的是对数组进行遍历。遍历一个数组的时候,一般使用for循环来完成。在遍历时,可以使用一个数组的重要属性length,它存储着这个数组的元素个数。在使用for循环时,可以合理地使用该属性。使用普通的for循环对数组进行遍历方法如示例5-5所示。
【示例5-5】普通for循环遍历数组

程序编译后,运行结果如下:

在对数组操作时,还可以使用增强型的for循环,其使用方式如示例5-6所示。
【示例5-6】增强for循环遍历数组

程序编译后,运行结果如下:

示例5-5和示例5-6使用了两种for循环来操作数组中的元素。对于增强for循环来说,临时变量值是用赋值的方式得到的,并不是数组中存放的值的本身。换句话说,它们在栈空间中的地址值不相等,如图5.5所示。我们可以直接通过array[index]的方式去修改数组中的元素值,但是不能通过临时变量去修改数组中的元素值,如示例5-7所示。
【示例5-7】增强for循环修改数组中的元素

程序编译后,运行结果如下:

通过示例程序5-7可以看出,使用增强for循环时,不能通过临时变量去修改数组中的元素值,只能使用普通for循环的方式对数组中的元素进行修改。

图5.5 增强for循环与普通for循环遍历数组的区别