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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CHJ 中级黑马   /  2013-10-2 00:29  /  1954 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 CHJ 于 2013-10-2 19:08 编辑

String s1 = "abc";   //建立了一个对象。
String s2 = new String("abc");  //建立了两个对象。

问一下:这两行一共建立了几个对象?是不是2个呢?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

9 个回复

倒序浏览
本帖最后由 陈洋 于 2013-10-3 09:19 编辑

String s1 = "abc";   //建立了一个对象。
String s2 = new String("abc");  //建立了两个对象。

答:一共在堆内存中建立了2个对象,建议使用第一种,节约内存。
回复 使用道具 举报
陈洋 发表于 2013-10-2 00:34
String s1 = "abc";   //建立了一个对象。
String s2 = new String("abc");  //建立了两个对象。

第一行,有了个"abc"了,第二行还创建新的么?
回复 使用道具 举报
陈洋 发表于 2013-10-2 00:34
String s1 = "abc";   //建立了一个对象。
String s2 = new String("abc");  //建立了两个对象。


不是两个吗?
回复 使用道具 举报

String s1 = "abc";   //建立了一个对象。
这里只是声明了一String类型的引用而已,这个引用s1指向了堆中的"abc"字符串对象。
---------------------------------------------------------------------------------------------------------------------
String s2 = new String("abc");  //建立了两个对象。
new了一个字符串对象,同时还有一个"abc"字符串对象,所以就是两个,并且后者每次都会调用构造器,生成新的对象,性能低且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向了同一个对象。


引至API:初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报 1 0
我的理解两句话执行下来,在内存中生成的只有两个对象。一个是“abc”对象,另一个是new出来的s2对象,但是new出来的对象的引用指向了s1对象的地址引用。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
s1类类型的变量指向了"abc", 在堆内存中有个"abc"对象的空间,   new出来的s2对象引用指向了"abc"  
由于字符串对象一旦创建时不能被改变的。 所有 new出来的对象引用指向的是"abc"对象在堆内存的地址值,
而不是在创建一个对象"abc"  所有我觉得那两行只有两个对象

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
陈洋 中级黑马 2013-10-3 09:19:18
8#

失误打错了。。是两个{:soso_e110:}
回复 使用道具 举报
陈洋 中级黑马 2013-10-3 09:21:10
9#
CHJ 发表于 2013-10-2 00:49
第一行,有了个"abc"了,第二行还创建新的么?

还是会创建的,因为有new,所以在堆内存中开辟了一个空间。不好意思,说错了,一共在内存中创建了2个对象。一开始打错了。
回复 使用道具 举报
本帖最后由 Nocturne 于 2013-10-3 15:44 编辑




  1. String s1 = "abc";   //在字符常量池中创立了一个“abc”,并将地址给礼物S1
  2. String s2 = new String("abc");  //如果这是单独的一句来说,它在字符常量池中创建了一个“abc”,还在堆里new出了一个对象并将对象引用地址给了s2,这样就成了两个;如果将第二句和第一句放在一块那就是创立了两个,一个在常量池一个在堆中
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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