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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨庆雷 中级黑马   /  2014-8-13 20:55  /  26534 人查看  /  42 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨庆雷 于 2014-8-13 23:43 编辑

我们已经知道了 String str = new String("abc");是创建了两个对象
1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
2,StringBuilder sb = new StringBuilder();
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String s = a+b+c+d;  这句话创建了几个对象
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").append("d");这句话创建了几个对象

-------------------------------------------------------------------------------------------
答案是  7   3    0

第一题:“a”“b”“c”“d” “ab”“abc”“abcd”
第二题: “ab”“abc”“abcd”
第三题:因为a”“b”“c”“d”在串池中已经存在,不会创建对象,并且StringBuilder添加字符串的时候跟String
是不一样的,StringBuilder是不会创建对象的(所以说我们在增加字符串长度的时候尽量用StringBuilder,这样会少创建对象,节省资源,提高效率)
所以是0个对象

点评

楼主怎么还不修改答案以免误导他人  发表于 2014-8-14 17:05
第一题的答案是错的,只有一个对象"abcd"  发表于 2014-8-13 23:51

42 个回复

正序浏览
来学习的
回复 使用道具 举报
第一:"a"+"b"+"c"+"d",的方式,过程中不用建对象,所以就一个最终对象;
第二:String s = a+b+c+d的方式,过程中要建对象,虽然运行后释放,所以楼主说的是编译过程还是运行后?我想大家都可以数出来吧.
同意的点支持,求斑竹分哈
回复 使用道具 举报
第一题:应该只有1个“abcd”,被编译器优化成:String s=“abcd”了;
第二题:如果不考虑之前的字符串池,创建的有5个:"a","b","c","d"和"abcd"。String s = a+b+c+d;等价于:String s = new StringBuilder().append("a").append("b").append("c").append("d").toString();
第三题按楼主这么考虑应该是对的。
楼主可以查看编译后的字节码。
回复 使用道具 举报
icris 中级黑马 2014-8-14 12:19:33
37#
木易在他乡 发表于 2014-8-14 10:25
StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个 ...

创建不在那一句不是不算吗
回复 使用道具 举报
String s="a"+"b"+"c"+"d"  创建了一个对象。等同于 String s=new String("a"+"b"+"c"+"d")
只占用一个堆地址空间
回复 使用道具 举报
icris 发表于 2014-8-13 21:55
String s="a"+"b"+"c"+"d" 这句的运算部分在编译时就完成了,运行时只有一个 "abcd" 对象
String s = a+b+c ...

StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个对象的.
回复 使用道具 举报
第一个应该是一个吧?不解?
回复 使用道具 举报
最近看到许多类似的帖子,大致意思如下:

问题1: String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,

答案是
就创建了一个
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个


问题2:但是如果改成 String s = a+b+c+d+e;
呢 又是几个了。

就是说上面是一个是因为 "a"、"b"、"c"、"d"、"e"都是常量
但如果是变量呢?



我的答案是3个对象,但只有一个String对象:

由于编译器的优化,最终代码为通过StringBuilder完成:

具体解释请参考http://blog.csdn.net/wgc461749883/article/details/38553787
回复 使用道具 举报
学习行学习
回复 使用道具 举报
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚 ...

abc就是一个,然后new又弄了个
回复 使用道具 举报
第一题怎么会有七个对象
回复 使用道具 举报
过程中应该是7个。求大神公布正确答案
回复 使用道具 举报
坐等大神回复。。。。。
回复 使用道具 举报
icris 中级黑马 2014-8-14 00:25:15
27#
杨庆雷 发表于 2014-8-14 00:21
最后是只存在一个 但是过程中确创建了7个 ,“a”“b““c”不会凭空而来   其他的没有引用的指向,被收 ...

编译和运行是两个分开的过程
回复 使用道具 举报
icris 发表于 2014-8-14 00:12
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释 ...

最后是只存在一个 但是过程中确创建了7个 ,“a”“b““c”不会凭空而来   其他的没有引用的指向,被收回

点评

垃圾回收是运行时的事情。。。编译器没这功能  发表于 2014-8-14 00:27
回复 使用道具 举报
icris 中级黑马 2014-8-14 00:12:57
25#
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释两个 StringBuilder sb = new StringBuilder(); ?
回复 使用道具 举报
神级啊,学习了
回复 使用道具 举报
学习了....                          
回复 使用道具 举报
liqi 中级黑马 2014-8-14 00:01:10
22#
坐等答案
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马