java中的堆和栈

来源:互联网 发布:网络模特余潇潇男朋友 编辑:程序博客网 时间:2024/04/28 17:43

数据结构一直是java软件编程中被人忽视的一部分,尤其是像我这样从半路出家的(大学的专业偏向数学),对数据结构的理解一直是模棱两可,项目中大多偏向于一些逻辑思路的实现也因此慢慢就忽略了数据结构的重要性。随着项目的逐步深入和对对象的生命周期的逐步了解,才慢慢感受到数据结构的重要性。
        此篇和大家探讨下java中堆和栈的相关东西,只是浅论,有和你想法冲突的大可提出质疑,我们共同探讨。
        java中的堆和栈其实就是java中利用内存存放数据的不同的方式。前段时间粗略看了下c++,java中的堆,和c中有一些差别,c中的堆的对象的生命周期需要程序自己控制,而java中有自己的控制机制,而程序员不能自己去控制堆的,只能获取他们的某些属性(例如得到垃圾回收器的一些属性),但java中的栈和c中的栈就我看来没有什么区别
下面简单描述下堆和栈的区别:
        java中的堆是一个运行时数据区,因为它是在运行时动态分配内存,例如我们在定义一个对象时,jvm会自动从堆中分配一块空间存储对象,而此对象的释放也不需要程序代码控制,因为堆是有垃圾回收控制地,编译器不需要知道此对象的生命周期,java的垃圾收集器会自动收走不再使用的对象或数据。java中的垃圾回收机制解决了c中对象的生命周期比较难控制的问题,但也由此带来了一些缺憾:由于运行时动态分配内存,所以java堆中的存取速度是非常慢地。但总体来说还是优点大于缺点,使得java的程序员在写程序时不需要像c程序员一样小心翼翼的去控制各个对象的生命周期,防止内存的溢出。
        java中的栈与堆相比,主要的优势在于它的存储速度比堆要快,栈的存储速度仅次于寄存器。但是它的缺点也比较突出:存在栈中的数据必须确定大小并确定生存期,由此使得此类数据缺乏灵活性。栈在java中的主要存放一些基本类型的变量和对象句柄,相信java中的基本类型大家都比较熟悉,它们是int、short、long、byte、float、double、boolean、char。
        栈还有一个很重要的特性,那就是存在栈中的数据是可以共享地。举个简单的例子:我们定义两个int型变量:int a=13;int b=13。编译器首先处理int a=13,它先在栈中创建一个变量为a的引用,然后查找栈中是否有13这个值,如果没有,编译器就把13存进栈中,然后将a指向13;然后处理int b= 13,创建完变量为b的引用后,搜索13,搜索到栈中有13,便把b直接指向13,这样a和b同时均指向13,出现了数据共享的情况。
        虽说上边的例子中体现了数据共享的情况,但是它们的引用可不是共享地,你问摸意思?还是举例说明,在上边数据的基础上,如果这时我们给a重新赋值会出现什么样的情况,会不会影响到b的值?答案是否定地,这个时候如果你给a赋值为14,则a首先会在栈中搜索有无14,若无,重新建立并存入栈中,若有,则把变量a的引用指向14.这时b的值还是13.由此可以看出栈区中变量的引用和堆中对象的引用共享是不一样地。

原创粉丝点击