黑马程序员技术交流社区

标题: 字符串创建的两种方式创建的对象分别在哪里? [打印本页]

作者: 何仕映    时间: 2013-3-24 15:25
标题: 字符串创建的两种方式创建的对象分别在哪里?
本帖最后由 何仕映 于 2013-3-24 18:25 编辑

在视频中毕老师讲到 String s = "abc";创建了一个对象
String s1 = new String("abc");创建了两个对象。
请问这些对象都分别在什么地方创建的呢?创建过程是如何的呢?麻烦各位大哥指点一下。最好附一张该创建过程的图。谢谢。

作者: 朱盛文    时间: 2013-3-24 15:55
String s1 = "abc",是直接从常量池里创建"abc"对象,此时是创建了一个对象。
String s2 = new String("abc"),则是先在堆内存中创建了一个对象,然后这个对象又去常量池里创建了一个"abc"的字符串对象,所以此时共创建了两个对象。
可以参考一下我画的内存图。

字符串的内存图.jpg (77.56 KB, 下载次数: 1)

字符串的内存图.jpg

作者: 魏福伟    时间: 2013-3-24 15:55
String Pool(字符串池)
String s = “aaa”;(采用字面值方式赋值)
查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建
一个“aaa”对象,然后将String  Pool中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,
赋给s引用。
String s = new String(“aaa”);
首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中
创建的这个“aaa”字符串对象。
如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创
建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s 引用,
导致s指向了堆中所创建的这个”aaa“对象。

希望对你有帮助。。。。
作者: 王瑞    时间: 2013-3-24 15:58
本帖最后由 王瑞 于 2013-3-24 16:05 编辑

楼上2个回答比我好~~~~~~~~~~~~




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