如何在Java中清空字符串缓冲区,以便下一次迭代使用一个清空的字符串缓冲区?
一个选项是使用以下的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
。 - OnaBai你有两个选择:
要么使用:
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
对象,否则它将在每次迭代中创建新对象。创建对象需要系统资源和空间,并且也需要时间。因此,如果可能,长期来看应该避免在循环内部声明它们。
public void clear(StringBuilder s) {
s.setLength(0);
}
使用方法:
StringBuilder v = new StringBuilder();
clear(v);
为了易读性,我认为这是最好的解决方案。
我建议为每个迭代创建一个新的StringBuffer
(或者更好的是StringBuilder
)。性能差异非常小,但您的代码会更短更简单。
buf.delete(0, buf.length());
已经有很好的答案了。只需添加一个基准测试结果,以比较StringBuffer和StringBuilder在循环中使用新实例或在循环中使用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方法以确保不是我的笔记本电脑出了一些问题,无法使用如此长的StringBuffer setLength方法 :-) 时间成本:3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
我觉得这段代码更快。
public static void clear(StringBuilder value) {
for (int i = 0, len = value.length(); i < len; i++) {
value.setCharAt(i, Character.MIN_VALUE);
}
value.setLength(0);
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("clear this password");
// use & process sb
clear(sb);
}
我认为清空 StringBuilder
最好的方法是使用 Clear()
方法。
StringBuilder sb = new StringBuilder();
sb.Clear();
注意:这仅适用于 .net
.Clear()
不存在。请参阅Javadoc。 - Andrea Richiardi