我在循环中使用了一个StringBuilder,每x次迭代我都想清空它,并从一个空的StringBuilder开始,但我看不到任何类似于. net StringBuilder的方法。在文档中很清楚,只有delete方法看起来太复杂了。

那么在Java中清理StringBuilder的最佳方法是什么呢?


当前回答

我认为这里的许多答案可能缺少StringBuilder中包含的质量方法:.delete(int start, [int] end)。我知道这是一个晚答复;但是,应该让大家知道这一点(并更彻底地解释)。

假设你有一个StringBuilder表——你希望在整个程序中动态地修改它(我现在正在做的就是这个)。

StringBuilder table = new StringBuilder();

如果你正在遍历方法并改变内容,使用内容,然后希望丢弃内容以“清理”StringBuilder以进行下一次迭代,你可以删除它的内容,例如:

table.delete(int start, int end). 

Start和end是要删除的字符的索引。不知道字符长度,想要删除整个东西?

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

现在,最精彩的部分。如前所述,StringBuilders在频繁更改时会产生大量开销(并且可能导致线程安全问题);因此,如果您的StringBuilder是用于与用户交互的目的,请使用StringBuffer -与StringBuilder相同(有少数例外)。

其他回答

如果您查看StringBuilder或StringBuffer的源代码,setLength()调用只是重置字符数组的索引值。恕我直言,使用setLength方法总是比新分配更快。他们应该将方法命名为“clear”或“reset”,这样会更清楚。

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

关于性能,请参阅相关文章:在循环中重用StringBuilder更好吗?

有两种方法:

使用stringBuilderObj.setLength(0)。 使用new StringBuilder()分配一个新的缓冲区,而不是清除缓冲区。注意,对于性能关键的代码路径,这种方法可能比基于setlength的方法慢得多(因为需要分配具有新缓冲区的新对象,旧对象就可以用于GC等)。

删除并不太复杂:

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

你还可以:

myStringBuilder.setLength(0);
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

这是简单的方法。