算法大爆炸:面试通关步步为营
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.2 数组的定义

可以通过以下方法定义一个整型数组。

或者,

上面两种定义数组的方法是等价的,不过这里更加推荐使用第1种方法定义数组,因为第1种方法更加符合Java的代码风格。

请注意,上面只是声明了一个引用变量array,其本质还是一个指针,而该数组本身并不存在,也就是说在内存中还没有开辟那段连续的存储空间。要使用该数组,必须先对数组进行初始化。

在Java中初始化数组有两种方法:静态初始化和动态初始化。

静态初始化指在定义数组时显式地指定数组的初始值,系统会根据初始值的个数和类型自动为数组在堆内存中开辟空间。例如,

或者

执行了上面的代码后,系统会在堆内存中分配6个int类型长度的内存空间,并为数组array初始化元素1、2、3、4、5、6。

动态初始化指在初始化数组时仅指定数组的长度,不指定数组元素的初始值,例如,

或者

执行了上面的代码后,系统会在堆内存中为数组array分配6个int类型长度的内存空间。需要注意的是,动态初始化数组不会显式地为数组指定初始值,系统会为该数组指定默认的初始值。

如果我们希望定义更加完备的数组结构,则可以定义一个数组类,对数组的属性和操作进行封装。下面这段代码描述了如何定义一个数组类。

MyArray是我们定义的数组类,在该类中包含两个成员变量:array表示一个int[]类型的数组,通过array[index]的形式可以引用到数组中的元素;成员变量elemNumber表示数组中元素的数量。在调用了MyArray(int capacity)构造函数初始化该数组后,elemNumber被赋值为0,这表示数组此时已在堆内存中开辟内存空间,但是还没有存入任何数据。

请注意区分数组的容量和数组中元素数量之间的区别。数组的容量指数组在堆内存中开辟出的内存单元的数量,也就是上述代码中构造函数的参数capacity所指定的大小,它表示该数组中最多可以存放多少个元素;而数组中元素的数量是变量elemNumber记录的数据,它表示该数组中当前存储的有效元素的数量,如图1-2所示。

图1-2 数组的容量和数组中元素的个数

我们可以通过array.length()函数获取数组的容量,所以在MyArray类中不需要再定义一个变量专门记录数组的容量。但是变量elemNumber是必需的,因为数组的容量与数组中元素的数量可能不相等,如图1-2所示,这就需要通过一个变量来记录数组中有效元素的数量,否则可能从数组中取出无效值。

除了array和elemNumber,MyArray类还定义了一些操作数组的方法,例如向数组中插入元素的函数insertElem(),从数组中删除元素的函数deleteElem()等,可以根据需要定义不同的操作方法,我们将在后续的章节中介绍如何实现这些方法。