这个问题在这里已有答案:
我在一个循环中使用StringBuilder并且我想要清空每个x次迭代并以空 StringBuilder
开头,但我在文档中看不到任何与.NET StringBuilder.Clear类似的方法,只是delete方法似乎过度了复杂 .
那么在Java中清理 StringBuilder
的最佳方法是什么?
这个问题在这里已有答案:
我在一个循环中使用StringBuilder并且我想要清空每个x次迭代并以空 StringBuilder
开头,但我在文档中看不到任何与.NET StringBuilder.Clear类似的方法,只是delete方法似乎过度了复杂 .
那么在Java中清理 StringBuilder
的最佳方法是什么?
9 回答
delete
并不过分复杂:你也可以这样做:
如果查看StringBuilder或StringBuffer的源代码,setLength()调用只会重置字符数组的索引值 . 使用setLength方法的IMHO总是比新的分配更快 . 他们应该将方法命名为“clear”或“reset”,以便更清楚 .
两种工作方式:
使用
stringBuilderObj.setLength(0)
.使用
new StringBuilder()
分配新的而不是清除缓冲区 .基本上有两种选择,使用
setLength(0)
重置StringBuilder或在每次迭代中创建一个新的 . 根据用途,两者都有利弊 .如果您事先知道StringBuilder的预期容量,则每次创建一个新容量应该与设置新长度一样快 . 它还将帮助垃圾收集器,因为每个StringBuilder都会相对较短,并且gc已针对此进行了优化 .
当您不知道容量时,重用相同的StringBuilder可能会更快 . 每次超出附加时的容量时,都必须分配新的后备阵列,并且必须复制先前的内容 . 通过重用相同的StringBuilder,它将在一些迭代后达到所需的容量,之后将不再进行任何复制 .
我将投票支持
sb.setLength(0);
,不仅因为它是一个函数调用,而且 because it doesn't actually copy the array into another array 就像sb.delete(0, builder.length());
. 它只是将剩余的字符填充为0并将长度变量设置为新的长度 .您可以查看它们的实现,以便在
setLength
函数和delete0
函数中验证我的观点 .是简单的方法 .
您应该使用
sb.delete(0, sb.length())
或sb.setLength(0)
并且不要创建新的StringBuilder() .有关性能,请参阅此相关帖子:Is it better to reuse a StringBuilder in a loop?
我认为这里的许多答案可能缺少
StringBuilder
中包含的质量方法:.delete(int start, [int] end)
. 我知道这是一个迟到的回复;然而,这应该是已知的(并且更详细地解释) .假设您有一个StringBuilder表 - 您希望在整个程序中动态修改它(我现在正在处理的那个),例如,
如果您循环遍历该方法并更改内容,请使用该内容,然后希望将内容丢弃到"clean up"以进行下一次迭代,您可以删除它的内容,例如
开始和结束是您要删除的字符的索引 . 不知道字符的长度,想删除整个东西?
现在,对于踢球者 . 如前所述,经常更改会产生大量开销(并且可能导致线程安全问题);因此,使用
StringBuffer
- 与StringBuilder
相同(除了少数例外) - 如果您的StringBuilder
用于与用户交互的目的 .如果性能是主要考虑因素......具有讽刺意味的是(IMO)用于格式化进入缓冲区的文本的Java构造在CPU上比在alloc / realloc / garbage集合上耗费更多时间......好吧,可能不是GC取决于您创建和丢弃的构建器数量 .
但是简单地将一个复合字符串(“Hello World of”6E9“earthlings . ”)附加到缓冲区可能会使整个问题变得无关紧要 .
而且,实际上,如果StringBuilder涉及的内容是复杂而冗长的,而不是简单的
String str = "Hi";
(不管怎样,Java可能会在后台使用构建器) .就个人而言,我尽量不滥用GC . 因此,如果它会在快速火灾场景中被大量使用 - 例如,编写调试输出消息......我只是假设在其他地方声明它并将其归零以便重复使用 .