鄢甲力童鞋的说法是错误的,请看下面的解析:
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在堆和栈上都有。 |