黑马程序员技术交流社区
标题:
字符串创建的两种方式创建的对象分别在哪里?
[打印本页]
作者:
何仕映
时间:
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)
下载附件
2013-3-24 15:51 上传
作者:
魏福伟
时间:
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