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

wat*_*ain 112 java string buffer

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

Jon*_*Jon 131

一种选择是使用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());
}
Run Code Online (Sandbox Code Playgroud)

另一个选项(位清理器)使用setLength(int len):

sb.setLength(0);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Javadoc:

  • 只需要在循环中声明StringBuffer就可以减少垃圾了. (15认同)
  • 啊,我想sb.setLength(0); 比在循环中声明它更清晰,更有效.您的解决方案违背了使用StringBuffer的性能优势...... (11认同)
  • 我认为性能优势来自字符串可变性,而不是保存实例化.这里是1e8迭代的快速测试:内部循环(2.97s):http://ideone.com/uyyTL14w,外部循环(2.87s):http://ideone.com/F9lgsIxh (6认同)
  • 说到性能:除非您的代码是在多线程场景中访问的,否则您应该使用StringBuilder而不是StringBuffer - 请参阅javadoc:"如果可能,建议使用此类优先于StringBuffer,因为它会更快大多数实施". (6认同)
  • 创建外部SB的唯一好处是不会丢失它的内部(可能很长)char [].如果在第一个迭代器中它长大了,第二个循环将不需要调整任何char []的大小.但是为了获得优势,"clear method"必须保留内部数组的大小.setLength可以做到这一点,但它也会将所有未使用的字符设置为\ u0000,因此仅仅创建一个具有良好初始容量的新SB的性能较差.在循环内部声明更好. (4认同)
  • @MarkElliot 这不会增加内存使用量吗? (2认同)
  • 是的,我的评论很愚蠢,不知道我在想什么=/ (2认同)

小智 46

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

public void setLength(int newLength)

你可能有这样的情况

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
Run Code Online (Sandbox Code Playgroud)

  • @MMahmoud,在代码示例中,它应该是`setLength`而不是`setlength`. (2认同)

Adi*_*ngh 18

您有两种选择:

使用:

sb.setLength(0);  // It will just discard the previous data, which will be garbage collected later.  
Run Code Online (Sandbox Code Playgroud)

或使用:

sb.delete(0, sb.length());  // A bit slower as it is used to delete sub sequence.  
Run Code Online (Sandbox Code Playgroud)

注意

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


Eli*_*kan 5

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

  • 如果您有任何此类性能差异的证据,请分享.(我也很高兴看到统计数据主要使用Java的位置,以及"大部分"的定义.) (2认同)

Ido*_*ler 5

public void clear(StringBuilder s) {
    s.setLength(0);
}
Run Code Online (Sandbox Code Playgroud)

用法:

StringBuilder v = new StringBuilder();
clear(v);
Run Code Online (Sandbox Code Playgroud)

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