java
堆和栈的区别
Java
的堆是一个运行时数据?/p>
,
类的
(
对象从中分配空间。这些对象通过
new
?/p>
newarray
?/p>
anewarray
?/p>
multianewarray
?/p>
指令建立,它们不需要程序代码来?/p>
式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生?/p>
期也不必事先告诉编译器,因为它是在运行时
动态分配内存的?/p>
Java
的垃圾收?/p>
器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,?/p>
取速度较慢?/p>
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点
是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一?/p>
基本?/p>
型的变量
(,int, short, long, byte, float, double, boolean, char)
?/p>
对象句柄?/p>
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定?/p>
:
int a = 3;
int b = 3;
编译器先处理
int a = 3;
首先它会在栈中创建一个变量为
a
的引用,然后查找
栈中是否?/p>
3
这个值,如果没找到,就将
3
存放进来,然后将
a
指向
3
。接着处理
int b = 3;
在创建完
b
的引用变量后,因为在栈中已经?/p>
3
这个值,便将
b
直接?/p>
?/p>
3
。这样,就出现了
a
?/p>
b
同时均指?/p>
3
的情况?/p>
这时,如果再?/p>
a=4;
那么编译器会重新搜索栈中是否?/p>
4
值,如果没有,则?/p>
4
存放进来,并?/p>
a
指向
4;
如果已经有了,则直接?/p>
a
指向这个地址。因?/p>
a
值的
改变不会影响?/p>
b
的值?/p>
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不?/p>
的,因为这种情况
a
的修改并不会影响?/p>
b,
它是由编译器完成的,它有利于节省