A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

字符串常量池和堆内存是什么关系?

7 个回复

倒序浏览
本帖最后由 AllenIverson 于 2015-7-24 21:07 编辑

堆内存:存放所有new出来的对象。栈内存:可以存放对这些对象的指针的引用。
常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

例如:  A a=new A();
这里new出来的A对象会被存放在堆中,而 a呢,会被存放到栈里,并且保存了对A这个对象引用的地址。
至于字符串池,是用来存放一些字符和栈和堆的关系,当我们创建一个字符串时,java会先在字符串池里寻找有没有你要创建的字符串。
例如: String  a="你好";
先寻找字符串池里有没有  "你好"  这个字符串,如果存在,就不会在堆中再创建.
如果不存在,就会在堆中创建 "你好" 这个字符串 并在栈中生成 a保存对其的地址引用 然后还会将新创建的字符串"你好" 保存到字符串池中.

回复 使用道具 举报
楼上是大神,问题都给你解决了,我也学习到了,谢谢
回复 使用道具 举报
受用了。
回复 使用道具 举报
AllenIverson 发表于 2015-7-24 21:01
堆内存:存放所有new出来的对象。栈内存:可以存放对这些对象的指针的引用。
常量池:存放字符串常量和基本 ...

谢谢你哈,我有两个疑问:
(1)"至于字符串池,是用来存放一些字符和栈和堆的关系," 这句话中的存放一些字符和栈和堆的关系怎么理解啊?
(2)“当我们创建一个字符串时,java会先在字符串池里寻找有没有你要创建的字符串。”这个创建是指不用new 建吗?例如 String s="abc"?   如果是String s="new String("Sabc")的话就不要找字符串常量池中有没有了吧,而是直接在堆中创建对不?
回复 使用道具 举报
编程小黑 发表于 2015-7-24 21:24
楼上是大神,问题都给你解决了,我也学习到了,谢谢

是的,所以我们也要好好学习,帮其他人解决问题哦
回复 使用道具 举报

你也要多提些问题哈
回复 使用道具 举报
1l太给力了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马