黑马程序员技术交流社区

标题: 字符串对象问题 [打印本页]

作者: 黑马-王言龙    时间: 2012-7-14 10:20
标题: 字符串对象问题
本帖最后由 黑马-王言龙 于 2012-7-14 19:44 编辑

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

总结:jvm编译时就将上面的"值"合并成了一个字符串:“abcdef”
那么在运行期间只会出现一个存在于常量池中的String对象。
作者: 张_涛    时间: 2012-7-14 10:25
本帖最后由 张_涛 于 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"字符串对象。
作者: 1161272014    时间: 2012-7-14 10:36
一共创建了六个对象

作者: 丁二跃    时间: 2012-7-14 10:59
我也问过这个问题 不过现在我更倾向于 是一个对象

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

换一种情况:


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

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







作者: 韩伟    时间: 2012-7-14 11:00
楼上的解释的很清楚,在s负值的过程中,确实在内存中产生了6个String类型的对象,但是我个人认为整个过程只创建了一个变量,那就是s,其值是"abcdef",因为之前的五个对象你根本没法再次使用,没有任何引用指向它们,会被垃圾回收机制从内存中清除掉,那么内存中就只留下了s 。
作者: 黑马刘涛    时间: 2012-7-14 11:14
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();
作者: 李思静    时间: 2012-7-14 11:15
一共创建了6个对象,老毕说过,字符串一旦创建,内容不可改变。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2