黑马程序员技术交流社区

标题: String str=new String("abc"); 创建了几个字符串? [打印本页]

作者: 不抛弃不放弃    时间: 2013-11-29 12:50
标题: String str=new String("abc"); 创建了几个字符串?
本帖最后由 不抛弃不放弃 于 2013-11-29 13:37 编辑

String str=new String("abc");  

这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。
我想知道的是,既然创建了两个 String 对象,那两个String对象的引用是谁呢?难道str同时指向两个对象,这应该不可能. 既然str指向了"abc",那另一个创建的对象跑哪儿去了呢?

作者: ixiangfeng    时间: 2013-11-29 12:53
指向的应该是new出来的那个吧 不是常量池的那个
作者: ixiangfeng    时间: 2013-11-29 12:54
如果是指向常量池那个的话那str == "abc"就应该为true了
作者: doitforyou    时间: 2013-11-29 13:18
String str = new String("abc");
这个语句首先会在堆内存中生成一个字符串对象“abc”,这是它的第一个对象,并将它赋值给str.
然后将堆内存中的对象“abc”同时生成到字符串常量池中,这是这个语句创建的第二个对象,以供其他字符串引用使用。
所以,此句话共创建了两个字符串对象,而str的引用指向的是堆内存中的对象。
作者: 刘敏    时间: 2013-11-29 16:24
本帖最后由 刘敏 于 2013-11-29 16:26 编辑

String str=new String("abc");   这句话准确的说,应该是1个或者2个。

String a = "abc";
String str=new String("abc");
如果之前已经有了"abc",那么就只新创建一个对象。

1. 首先在编译阶段 "abc" 的地址就已经确定,在常量区,当加载class 文件时,"abc" 被创建到常量区,
以后程序中的"abc"全部用常量区的地址,a 的值就是"abc"在常量区的地址。

2. new String("abc"); 在运行阶段,通过 new 在堆内存中开辟一块空间,然后把常量区的"abc" 复制到堆区。然后把堆内存中的地址赋给str。




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