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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© D.reamJA 高级黑马   /  2014-10-20 07:55  /  1126 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 D.reamJA 于 2014-10-20 08:23 编辑
  1. String  s1="abc";
  2. String  s2="abc";
  3. String  s3=new String("abc");
复制代码

我自己理解的,但是不知道对不对,请各位指教。
首先s1在堆内存中创建了一个对象,然后去常量池查找adc,有就直接在对象中引用,没有就在常量池写一个adc。
s2先去常量池查找adc,发现有值。然后直接引用s1在堆内存中的对象。
s3先创建一个String对象,然后查找常量池中的值,发现有adc,然后再新创建的String对象中,引用s1对象的地址.

我这么理解对么??



评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

倒序浏览
你看一下我的这个例子,和你的差不多,
问这两句话有什么区别?
String s="abc";//这句话是在字符串常量池中创建一个字符串对象,并把S引用成为一个变量
String s1=new String("abc");//这句话是在堆内存中用new的方式创建两个对象,因为一个是用new的,另一个是作为参数传进来的
答:上面是在常量池中创建一个对象,而下面创建两个对象,一个new出来的对象,一个字符串对象在堆内存中
还有你的s2是直接去常量池中找那个常量的,因为,在创建之前会判断常量池中是否有值,总结的不好,仅供参考

点评

这个帖子是之前同时刻相同问题太多,每个楼主和你加分。除此之外没有其他你回答问题没给加分的。都是你刷的。  发表于 2014-10-28 00:03

评分

参与人数 1黑马币 +6 收起 理由
杨佳名 + 6

查看全部评分

回复 使用道具 举报
纠正一下是“abc”,s2那你理解对了,至于s3它先在堆内存里创建一个对象,再把abc的引用指向堆内存里刚new出来的对象。纯属个人理解,个人认为是对的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马