java堆栈

来源:互联网 发布:wampserver mac下载 编辑:程序博客网 时间:2024/05/16 06:47

 

java中把内存分为两种:堆内存和栈内存。

其中java的基本数据类型(byte,char,short,int,float,double,Long,boolean)和引用数据类型(类,数组,接口)都是存放在栈中。而对象本身则存放在堆中;

 

 

ex:int a=1;  int b=2;  int c=1;  int d=2;

首先会创建 变量a的引用(实质是内存地址,以下提到引用的地方都为16进制的内存地址)。然后再栈中查找有没有1这个值,没有则将1存放进来,然后接着是b,同样会把2存放进来。再接着是c,栈中已经存在了值1,因此c直接指向值1,现在a和c相等了。再接着是d,将指向2,这样b和d相等了。

此时若修改a的值:a=2;有人可能会想修改了a指向的值1,那样不是会影响到c的值吗?

答案是这样的,a=2,首先会查找有没有2这个值,因为已经存在值2,所以a直接指向了值2。现在a不等于c了。a等于b等于d。

若修改a=3呢?同样会在栈类查找有没有值3,这里没有 因此值3被存进来,现在a指向值3。

这样a和谁也不相等了。

接下来说类(这里以Employee类作为例子。Employee的具体属性我们不需要),

Employee emp=New Employee();

这样会创建一个引用(emp)指向对象(New Employee()).引用存放在栈里,而对象则存放在堆里。

在来说说特殊的一个String。

String Str1="abc";

String Str2="abc";

这样首先创建一个Str1的引用,然后在栈类寻找值"abc",没有则abc被存进来,接着创建Str2引用,然后寻找值abc,因为刚才已经存入了值abc,因此现在Str2直接指向值abc。

所以Str1=Str2;

String St1=New String("abc");

String St2=New String("abc");

首先创建St1引用,然后找堆里面创建New String("abc");

接着创建St2引用,然后找堆里面创建New String("abc");

虽然都是abc,但是这里会在堆里创建两个完全一样的对象。所以St1!=St2;

对于New String("abc");一概在堆中创建新对象。不管值是否相等。这样无形降低了程序效率。

所以栈内的数据是可以共享的,而堆内的对象是相互独立的,数据不共享

原创粉丝点击