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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-王言龙 中级黑马   /  2012-7-14 10:20  /  2345 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-王言龙 于 2012-7-14 19:44 编辑

String s = "a" + "b" + "c" + "d" + "e" + "f" ;
请问:一共创建了多少对象?

总结:jvm编译时就将上面的"值"合并成了一个字符串:“abcdef”
那么在运行期间只会出现一个存在于常量池中的String对象。

6 个回复

正序浏览
一共创建了6个对象,老毕说过,字符串一旦创建,内容不可改变。
回复 使用道具 举报
String   concatenation   is   implemented   through   the   StringBuffer   class   and   its   append   method.也就是说在java内部的确是对+进行了重载,在处理String的过程中要创建一个StringBuffer对象,用StringBuffer对象的append方法对字符串进行连接,最后调用toString方法返回String字符串。
String   s   =   "a "   +   "b "   +   "c ";
就等于String   s   =   "abc ";

String   a   =   "a ";
String   b   =   "b ";
lss很透彻。
String   c   =   "c ";
String   s   =   a   +   b   +   c;
这个就不一样了,好像最终结果类似于:
StringBuffer   temp   =   new   StringBuffer();
temp.append(a).append(b).append(c);
String   s   =   temp.toString();

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上的解释的很清楚,在s负值的过程中,确实在内存中产生了6个String类型的对象,但是我个人认为整个过程只创建了一个变量,那就是s,其值是"abcdef",因为之前的五个对象你根本没法再次使用,没有任何引用指向它们,会被垃圾回收机制从内存中清除掉,那么内存中就只留下了s 。
回复 使用道具 举报
我也问过这个问题 不过现在我更倾向于 是一个对象

我们可以对代码进行反编译,可以看到 虚拟机究竟把我们代码编译成了什么
通过红色部分可以看到那一串字符串在编译过程直接就成了 abcdef

换一种情况:


我们可以看到 代码到 str =str +" m"+"n"; 时 java虚拟机自动 为我们新建了一个StringBuilder 对象
在 2 处 调用append 添加 str
在 3 处  调用append 添加 m
在 4 处 调用append 添加 n
在  5 处 返回 字符串

我么可以知道: 对于 常量字符串的 +  jvm 编译时直接认为 其为 +后的组合
                         对于变量参与的 + ,如 str +“b”  jvm 会自动生成一个StringBuilder 对象 调用append 方法进行操作 再返回字符串






点评

ok, 就你了  发表于 2012-7-14 19:35
我也反编译过了,结果确实像你说的一样!就一个对象!  发表于 2012-7-14 13:23

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
黑马-王言龙 + 1 赞一个!
韦念欣 + 1 实验验证,正解!

查看全部评分

回复 使用道具 举报
一共创建了六个对象
回复 使用道具 举报
本帖最后由 张_涛 于 2012-7-14 10:26 编辑

String是常量,其对象一旦创建完毕就无法改变。当使用"+"拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
所以,对于String s = "a" + "b" + "c" + "d" + "e" + "f" ;
应该创建了6个对象,分别为:
"a"、 "ab"、"abc"、"abcd"、"abcde"、"abcdef",并且这些对象存放在字符串池当中。
而s指向的是"abcdef"字符串对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马