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

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


当前回答

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

其他回答

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

您可以查看它们的实现,以验证我在setLength函数和delete0函数中的观点。

如果性能是主要考虑的问题,那么讽刺的是,在我看来,Java构造格式化进入缓冲区的文本,将比分配/重新分配/垃圾收集在CPU上花费更多的时间……好吧,可能不是GC(垃圾收集),这取决于您创建和丢弃了多少构建器。

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

而且,实际上,如果涉及到StringBuilder的实例,则内容是复杂的和/或比简单的String str = "Hi"更长;(不用担心Java可能会在后台使用一个构建器)。

就我个人而言,我尽量不滥用GC。因此,如果它将在快速场景中大量使用——比如,编写调试输出消息——我就假定在其他地方声明它,并将其归零以便重用。

class MyLogger {
    StringBuilder strBldr = new StringBuilder(256);

    public void logMsg( String stuff, SomeLogWriterClass log ) {

        // zero out strBldr's internal index count, not every
        // index in strBldr's internal buffer
        strBldr.setLength(0);

        // ... append status level
        strBldr.append("Info");

        // ... append ' ' followed by timestamp
        // assuming getTimestamp() returns a String
        strBldr.append(' ').append(getTimestamp());

        // ... append ':' followed by user message
        strBldr.append(':').append(msg);

        log.write(strBldr.toString());
    }
}

我认为这里的许多答案可能缺少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相同(有少数例外)。

删除并不太复杂:

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

你还可以:

myStringBuilder.setLength(0);

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