Java中的数组与内存控制

Java中的数组为静态数组,即一旦分配了内存,就不允许再更改其大小和所在内存的位置。Java语言的数组变量是引用类型的变量,例如,有这样一条语句:int num[] = new int[5]; num这个数组变量并非是数组本身,而是类似指针,存在于栈内存中,指向处于堆内存中实实在在的数组对象。平常所说的“Java中数组必须要被初始化”,并非是数组变量要被初始化,而是指真正的数组对象。例如,我们可以有这样一条语句:int num[]; 这是完全合法的,只不过这个数组变量没有指向真正的数组,所以无法使用。要想使用它,就必须赋予数组对象:num = new int[5]; 这样,一个存在于堆内存中的,长度为5的数组的“地址”就被赋给了num,即num “指向”了那个数组。

int[] num = new int[5]; int[] number; number = num; 这样,num 和number这两个数组变量都指向同一个数组对象。现在有这样一种情况:int[] num = new int[5]; int[] number = new int[6]; number = num; 这时,变量number原先所指向的数组由于没有指向它的变量,变成了垃圾,由Java的内存回收机制进行处理。

引用类型(包括数组,对象,等等)的数组变量不同于普通类型(整型,浮点型,等等),也就是说,引用类型的数组变量所指向的数组,其包含的数组元素仍旧是一个指针,每一个数组元素指向一个具体的对象。考虑这个情形:定义了一个Student类,并定义一个数组Student stu[] = new Student[2],数组元素是Student类的对象。stu这个变量是储存在栈内存中的,在堆内存中有一个长度为2的数组与其对应,数组元素仍为指针。现在又定义两个Student类的对象:stu0和stu1,并被实例化。这两个变量仍然储存在栈内存里,可以看成是指针,它们各指向堆内存中的一个区域,这个区域包含了对象的具体信息。做如下操作:stu[0] = stu0;stu[1] = stu1;现在,stu[0]指向了stu0指向的那块区域,stu[1]指向了stu1指向的那块区域。

最后,多维数组变量也是引用类型数组变量的一种。对于数组int array[2][],变量array储存在栈内存中,它指向堆内存中的一个包含两个元素的数组。其中每个元素的类型是一个引用类型(一维数组类型),并指向一个实实在在的数组,原理同上。

posted on 2012-02-19 19:08  浩太郎  阅读(2885)  评论(0编辑  收藏  举报

导航