如何在循环后清除Java中的字符串缓冲区,以便下一次迭代使用明确的字符串缓冲区?
答案 0 :(得分:124)
一种选择是使用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:
答案 1 :(得分:44)
重用StringBuffer
的最简单方法是使用方法setLength()
public void setLength(int newLength)
您可能会遇到类似
的情况StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
答案 2 :(得分:18)
您有两种选择:
使用:
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
个对象,否则它将在每次迭代时创建新对象。创建对象需要系统资源,空间并且还需要时间。因此,从长远来看,尽可能避免在循环内声明它们。
答案 3 :(得分:5)
buf.delete(0, buf.length());
答案 4 :(得分:5)
我建议为每次迭代创建一个新的StringBuffer
(甚至更好,StringBuilder
)。性能差异实际上可以忽略不计,但您的代码将更短更简单。
答案 5 :(得分:4)
public void clear(StringBuilder s) {
s.setLength(0);
}
用法:
StringBuilder v = new StringBuilder();
clear(v);
为了便于阅读,我认为这是最好的解决方案。
答案 6 :(得分:1)
那里已经很好的回答了。只需为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,3577,3408
循环中的新StringBuffer实例: 时间成本:8327,8324,8284
StringBuffer setLength 时间成本:22878,23017,22894
再次使用StringBuilder setLength来确保我的labtop没有遇到一些问题,使用这么长的StringBuffer setLength :-) 时间成本:3448
答案 7 :(得分:0)
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
我认为这段代码更快。
答案 8 :(得分:0)
我使用下面的代码来存储密码以进行临时处理,例如正则表达式匹配并在完成后清除它。通常的删除方法不会重置所有的角色,这是不适合我。这段代码满足了我的要求。
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);
}