程序员认知(二)堆和栈

这两个概念我觉得讲的很好的地方在百度词条:堆(Heap)栈(Stack)

堆栈是一种数据结构。主要功能是暂时存放数据和地址

  • 堆(数据结构):堆可以被看成是一棵树,如:堆排序

  • 栈(数据结构):一种先进后出的数据结构。


  1. 在Java中:栈(stack)与堆(Heap)都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置堆和栈。
    1. 的优势是:存取速度比快,仅次于直接位于CPU中的寄存器。

    2. 缺点是:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
    3. 栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的。
    1. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,JAVA的垃圾收集器会自动收走这些不再使用的数据(C#亦如此)。
    2. 缺点:要在运行时动态分配内存,存取速度较慢。

Java和C#中的数据类型有两种。

第一种是基本类型:8种:int、short、long、byte、float、double、boolean、char(注意:并没有string的基本类型)。

int a=3;
long b=255L;
  • 如上,称为自动变量。自动变量存的是字面值,不是类型的实例,即不是类的引用。这种字面值的数据。由于大小可知,生存期可知(定义在某个程序块中,程序块退出后,字段值消失),出于追求速度的原因,存在于栈中。
  • 栈中的数据可以共享。
int a=3;
int b=3;
  • 上述代码的过程:编译器先处理int a=3;首先它会在栈中创建一个变量为a的内存空间,然后查找有没有字段值为3的地址,没找到,就开辟一个存放数字3这个字面值的地址,然后将a指向3的地址。接着处理int b=3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

  • 特别注意的是,这种字面值的引用与类型引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。

    相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变。

    就是说:上面代码执行完:再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,他就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果有了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值