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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 三十而立 中级黑马   /  2014-1-19 19:19  /  1524 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 三十而立 于 2014-1-20 08:44 编辑
  1. String s2 = new String("abc");
复制代码

怎么理解,s2在内存中有两个对象,具体存放的位置是什么?

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

6 个回复

倒序浏览
具体细节参考http://hi.baidu.com/congwiny/item/f48fc9294583393694f62bdd
回复 使用道具 举报
String s2=new String("abc");创建了两个对象;具体过程是:当你执行这段代码时,先创建一个"abc"对象保存于字符串池中,然后JVM会在堆中再创建一个对象String对象。因此有两个对象,存储位置分别在字符串池和堆中!

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
一个是堆内存中的对象s2,
一个是常量池中的对象abc

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
有可能是两个对象
如果之前“abc”没有在内存中
那么这句话就创建了两个对象
第一个是“abc”这个对象
第二个是new String()
s2是new String()在内存中的地址
所以,如果有一个s1="abc";
那么s2==s1为false
s2.equals(s1)为true;

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
String s = new String("abc")实际上是"abc"本身就是字符串池中的一个对象,在运行 new String()时,把字符串池即pool中的字符串"abc"复制到堆中,并把这个对象的引用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。

字符串.png (28.55 KB, 下载次数: 17)

字符串.png

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
宋星 发表于 2014-1-19 20:33
String s = new String("abc")实际上是"abc"本身就是字符串池中的一个对象,在运行 new String()时,把字符 ...

好的,谢谢,非常受用!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马