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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何仕映 于 2013-3-24 18:25 编辑

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

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 王瑞 于 2013-3-24 16:05 编辑

楼上2个回答比我好~~~~~~~~~~~~
回复 使用道具 举报
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“对象。

希望对你有帮助。。。。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
String s1 = "abc",是直接从常量池里创建"abc"对象,此时是创建了一个对象。
String s2 = new String("abc"),则是先在堆内存中创建了一个对象,然后这个对象又去常量池里创建了一个"abc"的字符串对象,所以此时共创建了两个对象。
可以参考一下我画的内存图。

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

字符串的内存图.jpg

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

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