java - stringbuilder清空 - stringbuilder重置




如何清除或清空StringBuilder? (6)

delete不是太复杂:

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

你也可以这样做:

myStringBuilder.setLength(0);

这个问题在这里已经有了答案:

我在一个循环中使用了一个StringBuilder ,并且每一次迭代我都要清空它并从一个空的StringBuilder开始,但是我看不到类似于文档中的.NET StringBuilder.Clear任何方法,只是delete方法似乎过于复杂。

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


两种工作方式:

  1. 使用stringBuilderObj.setLength(0)
  2. new StringBuilder()分配一个新的而不是清除缓冲区。

基本上有两种选择,使用setLength(0)重置StringBuilder或在每次迭代中创建一个新的。 根据使用情况,两者都有优点和缺点。

如果您事先知道StringBuilder的预期容量,那么每次创建一个新的容量应该与设置新的容量一样快。 它也将有助于垃圾收集器,因为每个StringBuilder将会相对较短,并且gc会针对此进行优化。

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


如果性能是主要关注的话...讽刺(IMO)是Java构造来格式化进入缓冲区的文本将比alloc / realloc / garbage collection更耗时CPU ...而不是GC取决于您创建和丢弃的建造者数量。

但是简单地将一个复合字符串(“Hello World of”+ 6E9 +“earthlings。”)添加到缓冲区很可能使整个事情变得无关紧要。

而且,实际上,如果涉及到StringBuilder,则内容复杂且冗长,并且比简单的String str = "Hi";更长String str = "Hi"; (没关系,Java可能会在后台使用builder)。

就我个人而言,我尽量不要滥用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());
    }
}

我会投票支持sb.setLength(0); 不仅因为它是一个函数调用,而且因为它实际上并不将数组复制到另一个数组中,sb.delete(0, builder.length()); 。 它只是填充剩余的字符为0,并将长度变量设置为新的长度。

你可以看看他们的实现来验证我的点在here setLength函数和delete0函数。


我认为这里的许多答案可能会遗漏一个包含在StringBuilder的高质量方法: .delete(int start, [int] end) 。 我知道这是一个迟到的回复; 然而,这应该被公开(并且更彻底地解释)。

假设你有一个StringBuilder表格 - 你希望在整个程序中动态修改(我现在正在处理的一个表格是这样做的),例如

StringBuilder table = new StringBuilder();

如果循环遍历方法并修改内容,使用内容,然后希望放弃内容以“清理”下一次迭代的StringBuilder ,则可以删除它的内容,例如

table.delete(int start, int end). 

开始和结束是你想删除的字符的索引。 不知道字符长度,想删除整个事情?

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

现在,为踢球。 正如前面所提到的, StringBuilders在经常更改时会花费很多开销(并且可能导致与线程有关的安全问题); 因此,使用StringBuffer - 与StringBuffer相同(有一些例外) - 如果您的StringBuilder用于与用户进行交互的目的。





stringbuilder