?????? 在叙述以下问题时先解释一下java中的堆与栈:
?????? 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
? ? ?? 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。?????? 一般情况下,可以保存数据的地方有6个:寄存器、栈、堆、静态存储、常数存储和非RAM存储。其中,寄存器是保存数据最快的地方,但是它的数量有限且程序不能直接控制。栈、堆和静态存储都在于RAM中。其中栈保存数据的速度仅次于寄存器,一些基本类型变量和对象的引用变量数据可以保存在栈中,堆中保存的数据灵活性会更大一些,可以用来保存Java对象。被static修饰的数据可以保存在静态存储区域。常数存储,就是用来存储常数的。下面看一下一维数组和二维数组的内存是如何分配的:
??????? 一维数组:
???????? int [] a; 当声明这个一维数组时,就会在栈中产生一个与该数组名相同的引用变量a,由于只是数组的声明,并未产生一个实际的数组,所以堆中不有保存任何信息。声明一个数组后,就要使用new创建这个数组,a=new int[5];这时堆中就会分配一块内存给数组,此时,栈中的a中存放的就是堆中这块内存的首地址,
创建完后,就可以用for循环为数组赋值了。
??????? 二维数组:
??????? int[][] a;声明时与一维数组类似,创建这个二维数组:a=new int[3][];这种创建数组的方式未确定第2维的大小,此时堆栈分配情况如下图:
????? 再指明第二维数:
class="java" name="code">a[0] = new int[1]; a[1] = new int[2]; a[2] = new int[3];
?此时,数组的内存分配如图:
?最后再给这个不规则数组赋值,也就是改变堆中分配的内存中那些0的值。
?
??????? 这就是数组的创建和初始化的过程中,java内存分配的过程。当在使用中没有任何的引用变量去指向数组时,该数组就会被JVM当成垃圾自动回收了。
?
?