如何清除或清空StringBuilder?
我在一个循环中使用了一个StringBuilder ,并且每一次迭代我都要清空它并从一个空的StringBuilder
开始,但是我看不到任何与文档中的.Net StringBuilder.Clear类似的方法,只是删除方法似乎过于复杂。
那么在Java中清理StringBuilder
的最好方法是什么?
修改更新以引入反馈。
所以有两种工作方式:
- 使用
stringBuilderObj.setLength(0)
。 - 用
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
用于与用户进行交互的目的。