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");一概在堆中创建新对象。不管值是否相等。这样无形降低了程序效率。
所以栈内的数据是可以共享的,而堆内的对象是相互独立的,数据不共享
- java堆栈
- java堆栈
- java堆栈
- java堆栈
- java堆栈
- Java堆栈
- Java堆栈
- java堆栈
- Java堆栈
- JAVA堆栈
- java堆栈
- Java堆栈
- java堆栈
- JAVA 堆栈
- Java堆栈
- Java--堆栈
- java 堆栈
- java堆栈
- 观360和腾讯
- Testinside全新推出Cisco 646-230认证考试题库
- 各种链接
- 关于mysql的password加密函数问题
- rsync进行文件备份
- java堆栈
- 中文互联网巨头间的混战
- java值传递
- IT男必看的养生常识
- Bootloader全局变量重定位和KernelRelocate函数
- 方法中参数的传递
- 您在注册表编辑器中只能导入二进位注册文件
- 通过Run-Time Library中的time和localtime函数获取系统时间
- 说的艺术