这两个概念我觉得讲的很好的地方在百度词条:堆(Heap)栈(Stack)。
堆栈是一种数据结构。主要功能是暂时存放数据和地址。
-
堆(数据结构):堆可以被看成是一棵树,如:堆排序
-
栈(数据结构):一种先进后出的数据结构。
- 在Java中:栈(stack)与堆(Heap)都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置堆和栈。
-
栈
-
栈的优势是:存取速度比堆快,仅次于直接位于CPU中的寄存器。
- 缺点是:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
- 栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的。
-
-
堆
- 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,JAVA的垃圾收集器会自动收走这些不再使用的数据(C#亦如此)。
- 缺点:要在运行时动态分配内存,存取速度较慢。
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的值;如果有了,

最低0.47元/天 解锁文章
337

被折叠的 条评论
为什么被折叠?



