如何清除或清空StringBuilder?

我在一个循环中使用了一个StringBuilder ,并且每一次迭代我都要清空它并从一个空的StringBuilder开始,但是我看不到任何与文档中的.Net StringBuilder.Clear类似的方法,只是删除方法似乎过于复杂。
那么在Java中清理StringBuilder的最好方法是什么?

修改更新以引入反馈。

所以有两种工作方式:

  1. 使用stringBuilderObj.setLength(0)
  2. new StringBuilder()分配一个新的而不是清除缓冲区

基本上有两种select,使用setLength(0)重置StringBuilder或在每次迭代中创build一个新的。 根据使用情况,两者都有优点和缺点。

如果您事先知道StringBuilder的预期容量,则每次创build一个新的容量应该与设置新的容量一样快。 这也将有助于垃圾收集器,因为每个StringBuilder将是相对短暂的,并为此gc进行了优化。

当你不知道容量时,重复使用相同的StringBuilder可能会更快。 每次在追加时超过容量时,都必须分配一个新的后备数组,并且先前的内容必须被复制。 通过重复使用相同的StringBuilder,经过一些迭代后它将达到需要的容量,之后不会有任何复制。

delete不是太复杂:

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

你也可以这样做:

 myStringBuilder.setLength(0); 

如果您查看StringBuilder或StringBuffer的源代码,则setLength()调用将重置字符数组的索引值。 恕我直言,使用setLength方法将永远比新分配更快。 他们应该命名方法“清除”或“重置”,以便更清楚。

我会投票sb.setLength(0); 不仅因为它是一个函数调用,而且因为它实际上不会将数组复制到另一个数组中,sb.delete(0, builder.length()); 它只是填充剩余的字符为0,并将长度variables设置为新的长度。

你可以看看他们的实现来validation我的点在这里 setLength函数和delete0函数。

 StringBuilder s = new StringBuilder(); s.append("a"); s.append("a"); // System.out.print(s); is return "aa" s.delete(0, s.length()); System.out.print(s.length()); // is return 0 

是简单的方法。

你应该使用sb.delete(0,sb.length())或sb.setLength(0),而不是创build一个新的StringBuilder()。

看性能相关的post在循环中重用StringBuilder是否更好?

如果性能是主要关注的话……讽刺(imo)是java构造来格式化进入缓冲区的文本比alloc / realloc / garbage collection更耗费时间在CPU上而不是GC取决于您创build和丢弃的build造者数量。

但是简单地将一个复合string(“Hello World”+ 6E9 +“earthlings。”)添加到缓冲区很可能使整个事情变得无关紧要。

而且,实际上,如果涉及到StringBuilder,则内容比简单的String str =“Hi”复杂且冗长。 (nevermind java可能会在后台使用一个生成器)

就我个人而言,我尽量不要滥用GC。 所以,如果在快速的情况下这将会被使用很多 – 就像编写debugging输出消息一样……我只是假设在其他地方声明它,并将其归零。

 class MyLogger { StringBuilder strBldr = new StringBuilder(256); public LogMsg( String stuff ) { strBldr.setLength(0); // ... prepend status level strBldr.append("Info"); // ... prepend timestamp strBldr.append(" " + getTimestamp()); // ... user msg strBldr.append(":" + msg); log.write(strBldr.toString()); } } 

我想这里的许多答案可能会缺less一个包含在StringBuilder的高质量的方法: .delete(int start, [int] end) 。 我知道这是一个迟到的答复; 然而,这应该是已知的(并进行了更彻底的解释)。

比方说,你有一个StringBuilder表 – 你希望在整个程序中dynamic修改(我现在正在处理的一个表),例如

 StringBuilder table = new StringBuilder(); 

如果循环遍历方法并更改内容,则使用内容,然后希望丢弃内容以“清理”下一个迭代的StringBuilder ,可以删除它的内容,例如

 table.delete(int start, int end). 

开始和结束是你想删除的字符的索引。 不知道字符的长度,并想删除整个事情?

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

现在,为踢球。 如前所述, StringBuilders在频繁更改时会花费很多开销(并且可能会导致与线程有关的安全问题); 因此,使用StringBuffer – 与StringBuffer相同(有一些例外) – 如果您的StringBuilder用于与用户进行交互的目的。