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(" ");
}
答
第一个版本实际上将被编译成这样的:
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
答
第一个较慢。任何时候你创建一个新的对象,然后不得不垃圾收集它,它会增加一些开销并减慢你的系统。第二个更快 - 也许不是很多,但速度更快 - 我会自己使用它,而不是第一个。
你几乎回答了你自己的问题:)。第二个片段绝对是要走的路。 – 2014-12-01 19:29:13
后者会更好:) – 2014-12-01 19:29:38