Java数据保存与内存分配

       在叙述以下问题时先解释一下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维的大小,此时堆栈分配情况如下图:

      再指明第二维数:

a[0] = new int[1];
a[1] = new int[2];
a[2] = new int[3];

 此时,数组的内存分配如图:

 最后再给这个不规则数组赋值,也就是改变堆中分配的内存中那些0的值。

 

        这就是数组的创建和初始化的过程中,java内存分配的过程。当在使用中没有任何的引用变量去指向数组时,该数组就会被JVM当成垃圾自动回收了。

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值