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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 不抛弃不放弃 于 2013-11-29 13:37 编辑

String str=new String("abc");  

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

4 个回复

倒序浏览
指向的应该是new出来的那个吧 不是常量池的那个
回复 使用道具 举报
如果是指向常量池那个的话那str == "abc"就应该为true了
回复 使用道具 举报
String str = new String("abc");
这个语句首先会在堆内存中生成一个字符串对象“abc”,这是它的第一个对象,并将它赋值给str.
然后将堆内存中的对象“abc”同时生成到字符串常量池中,这是这个语句创建的第二个对象,以供其他字符串引用使用。
所以,此句话共创建了两个字符串对象,而str的引用指向的是堆内存中的对象。
回复 使用道具 举报
本帖最后由 刘敏 于 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。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 赞一个!

查看全部评分

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