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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

David.L 发表于 2014-8-13 23:42
什么时候要数对象?

比如说我们接收到了100W条字符串(不要觉得不可能),需要把他们合成一个字符串,你会怎么办?你会用String还是StringBuilder,你如果不知道上面这个帖子的原理  你就只能蒙一个方法,而蒙错的结果就是:你的程序效率会很低。
回复 使用道具 举报
liqi 中级黑马 2014-8-14 00:01:10
22#
坐等答案
回复 使用道具 举报
学习了....                          
回复 使用道具 举报
神级啊,学习了
回复 使用道具 举报
icris 中级黑马 2014-8-14 00:12:57
25#
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释两个 StringBuilder sb = new StringBuilder(); ?
回复 使用道具 举报
icris 发表于 2014-8-14 00:12
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释 ...

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

点评

垃圾回收是运行时的事情。。。编译器没这功能  发表于 2014-8-14 00:27
回复 使用道具 举报
icris 中级黑马 2014-8-14 00:25:15
27#
杨庆雷 发表于 2014-8-14 00:21
最后是只存在一个 但是过程中确创建了7个 ,“a”“b““c”不会凭空而来   其他的没有引用的指向,被收 ...

编译和运行是两个分开的过程
回复 使用道具 举报
坐等大神回复。。。。。
回复 使用道具 举报
过程中应该是7个。求大神公布正确答案
回复 使用道具 举报
第一题怎么会有七个对象
回复 使用道具 举报
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

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

abc就是一个,然后new又弄了个
回复 使用道具 举报
学习行学习
回复 使用道具 举报
最近看到许多类似的帖子,大致意思如下:

问题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
回复 使用道具 举报
第一个应该是一个吧?不解?
回复 使用道具 举报
icris 发表于 2014-8-13 21:55
String s="a"+"b"+"c"+"d" 这句的运算部分在编译时就完成了,运行时只有一个 "abcd" 对象
String s = a+b+c ...

StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个对象的.
回复 使用道具 举报
String s="a"+"b"+"c"+"d"  创建了一个对象。等同于 String s=new String("a"+"b"+"c"+"d")
只占用一个堆地址空间
回复 使用道具 举报
icris 中级黑马 2014-8-14 12:19:33
37#
木易在他乡 发表于 2014-8-14 10:25
StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个 ...

创建不在那一句不是不算吗
回复 使用道具 举报
第一题:应该只有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();
第三题按楼主这么考虑应该是对的。
楼主可以查看编译后的字节码。
回复 使用道具 举报
第一:"a"+"b"+"c"+"d",的方式,过程中不用建对象,所以就一个最终对象;
第二:String s = a+b+c+d的方式,过程中要建对象,虽然运行后释放,所以楼主说的是编译过程还是运行后?我想大家都可以数出来吧.
同意的点支持,求斑竹分哈
回复 使用道具 举报
来学习的
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马