浅谈堆栈

1.数据类型
    1.1 基本类型:byte、short、int、long、char、float、double、boolean,存放在栈
    1.2 引用类型:类类型,接口类型和数组,简单来说就是除了八大基本类型,其他都是引用类型,存储在堆中
2.堆(heap)和栈(stack)
    栈的起始点是main函数,即程序运行的一个起点(入口)
    堆是存放数据的内存单元,即存储单元
    简单来说堆是物理单元,栈是逻辑单元
    总结:
        1.栈是运行单元,堆是存储单元
        2.栈是解决程序的运行问题,即程序如何执行,如何处理,或者说是逻辑、业务
          堆是解决数据存储的问题,即数据怎么放,放在那里,或者说是内存,缓存
        在java中一个线程就会有相应的一个线程栈与之对应,因为执行的逻辑不同,所以需要一个独立的线程栈。
        而堆则是所有线程共享的,因为这是存储单元,所有的线程都能访问。
问题一:为什么要把堆和栈区分出来,栈中不是也可以存储数据吗
        1.栈代表了处理逻辑,堆代表了数据,这样分开,使得处理逻辑更为清晰,分而治之的思想。
        这种隔离、模块化的思想在软件设计的方方面面都有体现。
        2.堆和栈的分离,使得堆中的内容可以被多个栈共享
        3.栈因为运行时需要,比如保存系统运行的上下文,需要进行地址段的划分。
        栈只能向上增长,因此就会限制住栈存储内容的能力。
        堆中的对象是可以根据需要动态增长的。
        因此栈和堆的拆分使得动态增长成为可能,相应栈中只需要记录堆的一个地址即可。
        简单来说,栈中可以存放的只有对象的地址信息,堆是存储对象信息。
问题二:堆中存什么,栈中存什么
        1.栈存放的都是跟当前线程相关的信息
        2.堆中存放的是对象信息
问题三:为什么不把基本类型放堆中
        1.其占用的空间比较少
        2.长度固定,因此栈中存储就够了,如果在堆中存储就没有什么意义
        简单来说堆中存储的是引用类型,长度不固定,栈中存储的是基本类型以及引用类型的地址信息,长度固定。
问题四:java中的参数传递是传值还是引用
        1.对象传递是引用传递,基本类型的数据传递是值传递
        2.方法的参数传递,传递地址信息,所以是引用传递
        3.堆和栈的分离思想,才使得java的垃圾回收成为可能
 

原创文章 46 获赞 24 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39892293/article/details/86592919