黑马程序员技术交流社区

标题: 菜鸟问题。。。关于String [打印本页]

作者: 伍仪华    时间: 2011-7-31 11:13
标题: 菜鸟问题。。。关于String
String s = new String("abc");这句话执行完成之后,String Pool(字符串池)中有字符串常量abc么?
是不是abc只在堆上啊、
谢谢
作者: 匿名    时间: 2011-7-31 11:58
执行String s = new String("abc");与String s="abc"一样 相当于创建了一个String类型的对象,并且有实际的地址引用和数据,s对象的引用存放在内存栈中,abc的实际数据存放在内存堆中
作者: 匿名    时间: 2011-7-31 13:17
标题: 回复 沙发 的帖子
鄢甲力童鞋的说法是错误的,请看下面的解析:
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在堆和栈上都有。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2