others - 如何才能清除或者清空StringBuilder ?

我在循环中使用一个StringBuilder ,每x个迭代要清空,并从一个空的StringBuilder开始,但是我在文档里找不到类似.Net StringBuilder.Clear的方法,只是,别的方法看起来太复杂了,
那么,在Java中清理StringBuilder的最佳方法是什么?

时间:

有两种工作方式:

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

基本上有两个选择,使用 setLength(0) 来重置 StringBuilder 或者在每次迭代中创建一个新的。 两者都有利弊,具体取决于用法。

如果事先知道 StringBuilder的预期容量,每次创建一个新的都应该与设置一个新的长度一样快。 它还将帮助垃圾收集器,因为每个 StringBuilder 都相对较短,并且gc对它进行了优化。

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

delete并不复杂:


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

这是很简单的方法。

如果性能是主要考虑因素。。 具有讽刺意味的( imo ) java构造格式的文本进入缓冲区将耗时在cpu上远远超过 alloc/realloc/garbage 收集。 嗯,可能不是GC取决于你创建和丢弃的生成器数量。

只是附加的复合弦("hello World"+ 6E9 +"earthlings 。") 缓冲区可能使整个无关紧要的问题。

实际上,如果涉及到 StringBuilder,内容复杂且冗长,比简单字符串 str ="高"长;( nevermind 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());
 }
}

我认为这里的许多答案可能缺少 StringBuilder 中包含的质量方法: .delete(int start, [int] end) 我知道这是一个延迟回复;但是,这应该是已知的( 并进一步解释了一点) 。

假设你有一个 StringBuilder 表,你希望在整个程序( 我现在正在处理的一个) e.g. 中动态修改它


StringBuilder table = new StringBuilder();

如果你是遍历和修改内容的方法,使用内容,然后希望抛弃内容"清理" StringBuilder 为下一次迭代,你可以删除内容, e.g.


table.delete(int start, int end). 

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


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

现在,爱发牢骚的人。StringBuilders, 正如前面提到的,需要大量的开销,当改变经常( 并且会导致线程的安全问题) ;因此,使用 StringBuffer ——一样 StringBuilder ( 有几个例外) ——如果你 StringBuilder 用于与用户接口的目的。

我将投票给 sb.setLength(0); 不仅因为它是一个函数调用但因为它实际上没有数组复制到另一个数组sb.delete(0, builder.length()); 一样,它只是填补剩余的字符 0和长度变量设置为新的长度。

你可以看看它们的实现来验证我的观点从 setLength 函数和 delete0 函数。

...