循环后清除字符串缓冲区/构建器

如何在循环之后清除 Java 中的字符串缓冲区,以便下一次迭代使用清晰的字符串缓冲区?

165061 次浏览

一种选择是按以下方式使用 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());
}

另一个选项(位清除器)使用 SetLlength (int len):

sb.setLength(0);

更多信息见 贾瓦多克:

buf.delete(0,  buf.length());

我建议为每次迭代创建一个新的 StringBuffer(甚至更好,StringBuilder)。性能上的差异确实可以忽略不计,但是您的代码将会更短更简单。

重用 StringBuffer的最简单方法是使用方法 setLength()

public void setLength(int newLength)

你可以把这个案子

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();

我觉得这个代码更快。

你有两个选择:

无论使用哪种方法:

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.

注意

避免在循环中声明 StringBufferStringBuilder对象,否则它将在每次迭代中创建新对象。对象的创建需要系统资源、空间和时间。因此,对于长期运行,尽可能避免在循环中声明它们。

答案已经很好了。只需添加 StringBuffer 和 StringBuild 性能差异的基准测试结果,在循环中使用新实例或在循环中使用 setLlength (0)。

摘要是: 在一个大循环中

  • StringBuilder 比 StringBuffer 快得多
  • 在循环中创建新的 StringBuilder 实例 与 setLlength (0)的区别。(setLlength (0)比创建新实例有非常非常非常小的优势。)
  • 通过在循环中创建新实例,StringBuffer 比 StringBuilder 慢
  • StringBuffer 的 setLlength (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

长度: 时间成本: 3465,3421,3557,3408

新的 StringBuffer 循环实例: 时间成本: 8327,8324,8284

字符串缓冲区长度 时间成本: 22878,23017,22894

同样,为了确保我的笔记本电脑不会因为 StringBuffer setLlength:-而使用这么长的时间而出现问题 时间成本: 3448

public void clear(StringBuilder s) {
s.setLength(0);
}

用法:

StringBuilder v = new StringBuilder();
clear(v);

为了可读性,我认为这是最好的解决方案。

我使用下面的代码来存储用于临时处理(如正则表达式匹配)的密码,并在完成后清除它。通常的删除方法不会重置所有字符,这不适合我。这个代码满足了我的要求。

    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 中工作