日期:2014-05-20  浏览次数:20705 次

字符串的那点事
本帖最后由 BaronZ 于 2012-12-02 22:17:50 编辑

String str = null;
StringBuffer sb = new StringBuffer();
for(int i=0;i<100;i++){
  str = str + i;//(1)不推荐
  sb.append(i+"");//(2)推荐
}

我们都知道,像(1)那种方式去对字符串进行改变是不推荐的。对于不推荐的原因,我自己的理解是,
String定义的是字符串常量,值是不可改变的。如果进行(1)的操作,每次就会生成一个新的字符串常量(改变之前的那个字符串常量会被垃圾回收吗?)。这样效率就会低。是这个原因不推荐吗?
麻烦大神们解释一下


================================广告分割线===============================


------最佳解决方案--------------------
看看就明白:http://zhidao.baidu.com/question/301700630.html
------其他解决方案--------------------
我补充吧,本来我还怕我说的不对,后来我去查了一下资料,确实了我的答案,我整理了一下,LZ 应该可以清楚了,这次:
首先,我在 14 楼说的对了,举个简单的例子吧:
对于String 类,有一个字符串并接,也就是“+”,操作符的运算。
对于 String s = "a" + "4" + "b";
等价于:
String s = new StringBuffered().append("a").append("4").append("b").toString();
(这里是合并着写)。
这个例子足够说明我在 14 楼说的观点了。
------其他解决方案--------------------
引用:
各路高手有没有其他高见?
http://blog.csdn.net/yirentianran/article/details/2871417这个博客写的挺好的,其实+的连接操作实现上还是通过StringBuffer或者StingBuild实现的,+操作和StringBuffer的效率在于,当大数据量操作时,+需要创建多次StringBuffer对象,然后再append,区别应该就在这里。
------其他解决方案--------------------
其实主要原因不是LZ说的空间的问题,假设空间足够大,你再多的对象不回收和这个效率没有多大关系的。
5 楼说的对一半,主要原因是 循环的过程,对于 String的 新对象(即 +),首先会转换成StringBuffered,然后生成新的对象,再从 StringBuffered转变成为所需的String;
而对象StringBuffered 则不会产生新的对象,也就是说在循环结束之前都一直追加结束。
从上面的过程,就知道 对于用第一种情况,效率当然不高了。。。。
------其他解决方案--------------------
append是追加字符串,不会生成一个新的对象,+号,没+一次就生成一个新的对象,你说循环1000此,多少字符串对象?可以想象那种效率高了。
------其他解决方案--------------------
是的,你说的没错
------其他解决方案--------------------
我也觉得没错
------其他解决方案--------------------
你的理解是对的。
------其他解决方案--------------------
引用:
append是追加字符串,不会生成一个新的对象,+号,没+一次就生成一个新的对象,你说循环1000此,多少字符串对象?可以想象那种效率高了。


+1
StringBuffer吧!
------其他解决方案--------------------
sb.append(i+"");
你这个有点自欺欺人了...这个写法和上面那个有区别吗...都是做了一次字符串加
这个应该这样写
sb.append(i).append("[凡是用加号连接的部分]");
------其他解决方案--------------------
只要分享就有功劳。
------其他解决方案--------------------

路过,顶个

------其他解决方案--------------------
大周一的,顶起来给高手看看 
------其他解决方案--------------------
引用:
append是追加字符串,不会生成一个新的对象,+号,没+一次就生成一个新的对象,你说循环1000此,多少字符串对象?可以想象那种效率高了。

之前旧的对象不会被回收吗?
------其他解决方案--------------------
引用:
看看就明白:http://zhidao.baidu.com/question/301700630.html

百度知道上的空上好像有点道理,高手吗觉得怎样?
str += "here";
可以等同于
StringBuffer sb = new StringBuffer(str);