Answers:
一种选择是使用delete方法,如下所示:
StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
sb.append("a");
// This will clear the buffer
sb.delete(0, sb.length());
}
另一个选项(位清除器)使用setLength(int len):
sb.setLength(0);
有关更多信息,请参见Javadoc:
重用的最简单方法StringBuffer
是使用方法setLength()
public void setLength(int newLength)
你可能有这样的情况
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
setLength
而不是setlength
。
您有两种选择:
可以使用:
sb.setLength(0); // It will just discard the previous data, which will be garbage collected later.
或使用:
sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence.
避免在循环中声明StringBuffer
或StringBuilder
对象,否则每次迭代都会创建新对象。创建对象需要系统资源,空间并且还需要时间。因此,从长远来看,请尽可能避免在循环中声明它们。
我建议为每次迭代创建一个新的StringBuffer
(甚至更好的StringBuilder
)。性能差异确实可以忽略不计,但是您的代码将更短,更简单。
public void clear(StringBuilder s) {
s.setLength(0);
}
用法:
StringBuilder v = new StringBuilder();
clear(v);
为了提高可读性,我认为这是最好的解决方案。
那里已经很好的答案。只需为StringBuffer和StringBuild性能差异添加基准测试结果,即可在循环中使用新实例或在循环中使用setLength(0)。
摘要是:大循环
非常简单的基准测试(我只是手动更改了代码并进行了不同的测试):
public class StringBuilderSpeed {
public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'};
public static void main(String a[]){
int loopTime = 99999999;
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < loopTime; i++){
for(char c : ch){
sb.append(c);
}
sb.setLength(0);
}
long endTime = System.currentTimeMillis();
System.out.println("Time cost: " + (endTime - startTime));
}
}
循环中的新StringBuilder实例:时间成本:3693、3862、3624、3742
StringBuilder setLength:时间成本:3465、3421、3557、3408
循环中的新StringBuffer实例:时间成本:8327、8324、8284
StringBuffer setLength时间成本:22878、23017、22894
再次使用StringBuilder setLength来确保不是我的Labtop在StringBuffer setLength中使用这么长的时间有问题:-)时间花费:3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
我认为这段代码更快。