java - 如何清除或清空StringBuilder?
这个问题在这里已有答案:
循环后清除字符串缓冲区/构建器 8个答案
我在一个循环中使用一个StringBuilder,每个x迭代我要清空它并以一个空的StringBuilder开头,但我在文档中看不到任何类似于.NET StringBuilder.Clear的方法,只是删除方法 看起来过于复杂。
那么用Java清理StringBuilder的最佳方法是什么?
9个解决方案
586 votes
两种工作方式:
使用new StringBuilder()。
使用new StringBuilder()分配新的,而不是清除缓冲区。
Marcus Frödin answered 2019-03-29T10:50:30Z
276 votes
基本上有两种选择,使用setLength(0)重置StringBuilder或在每次迭代中创建一个新的StringBuilder。 根据用途,两者都有利弊。
如果您事先知道StringBuilder的预期容量,则每次创建一个新容量应该与设置新长度一样快。 它还将帮助垃圾收集器,因为每个StringBuilder都会相对较短,并且gc已针对此进行了优化。
当您不知道容量时,重用相同的StringBuilder可能会更快。 每次超出附加时的容量时,都必须分配新的后备阵列,并且必须复制先前的内容。 通过重用相同的StringBuilder,它将在一些迭代后达到所需的容量,之后将不再进行任何复制。
Jörn Horstmann answered 2019-03-29T10:51:11Z
69 votes
delete并不过分复杂:
myStringBuilder.delete(0, myStringBuilder.length());
你也可以这样做:
myStringBuilder.setLength(0);
krtek answered 2019-03-29T10:51:46Z
24 votes
如果查看StringBuilder或StringBuffer的源代码,setLength()调用只会重置字符数组的索引值。 使用setLength方法的IMHO总是比新的分配更快。 他们应该将方法命名为“clear”或“reset”,以便更清楚。
Javamann answered 2019-03-29T10:52:15Z
15 votes
我将投票支持setLength,不仅因为它是一个函数调用,而且因为它实际上并没有将数组复制到另一个数组中,如delete0.它只是将剩余的字符填充为0并将长度变量设置为新的长度。
您可以从setLength函数和delete0函数中查看它们的实现以验证我的观点。
Ahmed Hegazy answered 2019-03-29T10:53:06Z
4 votes
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
是简单的方法。
javaddroid answered 2019-03-29T10:53:44Z
4 votes
您应该使用sb.delete(0, sb.length())或sb.setLength(0)并且不要创建新的StringBuilder()。
请参阅此相关帖子了解性能:在循环中重用StringBuilder会更好吗?
Tony Meng answered 2019-03-29T10:54:28Z
2 votes
我想这里的许多答案可能都缺少StringBuilders:StringBuffer中包含的质量方法。我知道这是一个迟到的回复; 然而,这应该是已知的(并且更详细地解释)。
假设您有一个StringBuilder表 - 您希望在整个程序中动态修改它(我现在正在处理的那个),例如,
StringBuilder table = new StringBuilder();
如果您循环浏览方法并更改内容,请使用内容,然后希望丢弃内容以“清理”StringBuilders以进行下一次迭代,您可以删除它的内容,例如
table.delete(int start, int end).
开始和结束是您要删除的字符的索引。 不知道字符的长度,想删除整个东西?
table.delete(0, table.length());
现在,对于踢球者。 StringBuilders,如前所述,经常更改会占用大量开销(并且可能导致线程安全问题); 因此,使用StringBuffer - 与StringBuilder相同(除了少数例外) - 如果您的StringBuilder用于与用户连接。
Thomas answered 2019-03-29T10:56:01Z
2 votes
如果性能是主要考虑因素......具有讽刺意味的是(IMO)用于格式化进入缓冲区的文本的Java构造在CPU上比在alloc / realloc / garbage集合上耗费更多时间......好吧,可能 不是GC取决于您创建和丢弃的构建器数量。
但是简单地将一个复合字符串(“Hello World of”+ 6E9 +“earthlings。”)附加到缓冲区可能会使整个问题变得无关紧要。
而且,实际上,如果StringBuilder涉及的内容复杂而冗长且比简单的String str = "Hi";更长(更不用说Java可能在后台使用构建器)。
就个人而言,我尽量不滥用GC。 因此,如果它会在快速火灾场景中被大量使用 - 例如,编写调试输出消息......我只是假设在其他地方声明它并将其归零以便重复使用。
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());
}
}
DevByStarlight answered 2019-03-29T10:57:06Z