循环后清除string缓冲区/构build器

如何在Java中清除Java中的string缓冲区,以便下一次迭代使用明确的string缓冲区?

一种select是使用如下的删除方法:

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 

你有两个select:

可以使用:

 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对象,否则每次迭代都会创build新的对象。 对象的创build需要系统资源和空间,同样需要时间。 所以长期以来,如果可能的话避免在一个循环内声明它们。

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

我build议为每个迭代创build一个新的StringBuffer (甚至更好, StringBuilder )。 性能差异是微不足道的,但是你的代码会更短,更简单。

那里已经有很好的答案了。 只需在循环中为StringBuffer和StringBuild性能差异添加新的实例,或者在循环中使用setLength(0)即可。

总结是:在一个大的循环中

  • StringBuilder比StringBuffer快得多
  • 在循环中创build新的StringBuilder实例与setLength(0)没有区别。 (setLength(0)比创build新实例具有非常非常小的优势。)
  • 通过在循环中创build新实例,StringBuffer比StringBuilder慢
  • StringBuffer的setLength(0)比在循环中创build新的实例要慢得多。

非常简单的基准(我只是手动改变了代码,做不同的testing):

 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,以确保不是我的labtop得到了一些问题,使用这种长时间的StringBuffer setLength :-)时间成本:3448

 StringBuffer sb = new SringBuffer(); // do something wiht it sb = new StringBuffer(); 

我认为这个代码更快。