StringBuffer和追加方法

问题描述:

下面是否会减慢append方法的性能,并在append中创建了多少个String对象?StringBuffer和追加方法

long[] numbers = new long[20]; 

StringBuffer result = new StringBuffer(20); 

for (int i = 0; i <= max; i++) { 

    result.append(numbers[i] + " "); 

} 
System.out.println(result); 

我的意思是,如果字符串是不可改变的,追加方法应该创建一个numbers[i]然后另一个用于空间" ",将它们组合成一个最终的一个垃圾收集两个?我错了吗 ?是加号在这里是矫枉过正还是应该使用以下内容:

for (int i = 0; i <= max; i++) { 

    result.append(numbers[i]); 
    result.append(" "); 
} 
+0

你几乎回答了你自己的问题:)。第二个片段绝对是要走的路。 – 2014-12-01 19:29:13

+0

后者会更好:) – 2014-12-01 19:29:38

第一个版本实际上将被编译成这样的:

for (int i = 0; i <= max; i++) { 

    result.append(new StringBuilder(numbers[i]).append(" ").toString()); 

} 

所以你可以看到,我们正在创建在每次迭代一个全新的StringBuilder然后把它扔了。

所以你的第二个版本好多了,因为它只会使用1个StringBuffer。

我还建议您使用StringBuilder而不是StringBuffer,因为StringBuffers同步,并且您似乎只在单个线程中使用它。

+1

+用于显示生成的编译代码(我的速度慢于我的答案)和+为推荐使用StringBuilder与焦点的StringBuffer是syncronize – 2014-12-01 19:34:59

第一个较慢。任何时候你创建一个新的对象,然后不得不垃圾收集它,它会增加一些开销并减慢你的系统。第二个更快 - 也许不是很多,但速度更快 - 我会自己使用它,而不是第一个。