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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 伍仪华 黑马帝   /  2011-7-31 11:13  /  1828 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = new String("abc");这句话执行完成之后,String Pool(字符串池)中有字符串常量abc么?
是不是abc只在堆上啊、
谢谢

评分

参与人数 1技术分 +1 收起 理由
admin + 1 讨论过n遍的问题

查看全部评分

2 个回复

倒序浏览
黑马网友  发表于 2011-7-31 11:58:38
沙发
执行String s = new String("abc");与String s="abc"一样 相当于创建了一个String类型的对象,并且有实际的地址引用和数据,s对象的引用存放在内存栈中,abc的实际数据存放在内存堆中

评分

参与人数 1技术分 +1 收起 理由
admin + 1 先给分吧

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 13:17:37
藤椅

回复 沙发 的帖子

鄢甲力童鞋的说法是错误的,请看下面的解析:
String比较深入的解析,请查看帖子:[url]http://bbs.itheima.com/thread-377-1-1.html[/url]
清晰的学习String需具备的知识:
[color=Red]1.内存栈与堆
详细知识请看我回答的内容:[url]http://bbs.itheima.com/thread-360-1-1.html[/url]
2.String的关键知识点
String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
String Pool(字符串池)——内存栈——即你上面说的缓冲池

String s = “aaa”;(采用字面值方式赋值)
1) 查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。

String s = new String(“aaa”);       ——堆内存
1) 首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2) 如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个”aaa“对象。[/color]


[quote]String s = new String("abc");这句话执行完成之后,String Pool(字符串池)中有字符串常量abc么?
是不是abc只在堆上啊、 [/quote]
abc在堆和栈上都有。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马