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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jinhu358 中级黑马   /  2013-5-12 13:57  /  1941 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jinhu358 于 2013-5-13 18:58 编辑

new String("aaa");    为什么会产生2个对象呢 ?     希望能详细说明下     

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 追问的不错

查看全部评分

11 个回复

倒序浏览
new String("aaa");
"aaa"是一个对象。(常量)
又new出一个内容是"aaa"的String类对象(堆内存对象)。所以是两个。
回复 使用道具 举报
“aaa”本身就是一个对象
new String(...);又new出来一个对象
回复 使用道具 举报
一个对象是"aaa"还有一个匿名对象在堆中;
new String("aaa"); 这句话好像没有意义啊,你创建一个对象却不给它名字。。。
回复 使用道具 举报
尹桥印 发表于 2013-5-12 14:00
两个
"aaa"是一个,放在常量池中
还有一个是被new出来放在堆中原实例对象

被new出来放在堆中原实例对象    是什么呢?  能说的再详细一点吗 ?  还是有些晕,不是太明白
回复 使用道具 举报
new String"abc"
1.先在常量池里寻找是否有abc的字符串,没有,创建出来。
2. new运算符,使得在堆内存中开辟空间,从常量池中复制出来。
所以有两个对象。
而如果是String a="abc",则只有一个。原因是只执行了上面步骤的第一步。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
chouwayメ 发表于 2013-5-12 14:11
new String"abc"
1.先在常量池里寻找是否有abc的字符串,没有,创建出来。
2. new运算符,使得在堆内存中开 ...

你是说 new 运算符,在堆中开辟空间后,然后引用 常量池 里的地址吗?    是这样的吗?  
回复 使用道具 举报
尹桥印 发表于 2013-5-12 14:13
这样说吧假如你的代码是:
String s=new String("aaa");
一个是"aaa",这个明白吧

恩恩 , 说的很明白    谢谢啦   !  
回复 使用道具 举报
jinhu358 发表于 2013-5-12 14:16
你是说 new 运算符,在堆中开辟空间后,然后引用 常量池 里的地址吗?    是这样的吗?   ...

不是的,
堆内存放的是可是对象。
回复 使用道具 举报
那个,相同的字符串,不是指存在一个么?  怎么就出来两个对象了???

new String(); 一般不都是将数字之类的转换成字符串进行一些便捷操作么?  干嘛还要将已经是字符串的"aaa" new String();  ???

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