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

时间:2010-02-11 05:27:33

标签: java string buffer

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

9 个答案:

答案 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.  

避免在循环中声明StringBufferStringBuilder个对象,否则它将在每次迭代时创建新对象。创建对象需要系统资源,空间并且还需要时间。因此,从长远来看,尽可能避免在循环内声明它们。

答案 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)。

摘要是:在大循环中

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