我在循环中使用了一个StringBuilder,每x次迭代我都想清空它,并从一个空的StringBuilder开始,但我看不到任何类似于. net StringBuilder的方法。在文档中很清楚,只有delete方法看起来太复杂了。
那么在Java中清理StringBuilder的最佳方法是什么呢?
我在循环中使用了一个StringBuilder,每x次迭代我都想清空它,并从一个空的StringBuilder开始,但我看不到任何类似于. net StringBuilder的方法。在文档中很清楚,只有delete方法看起来太复杂了。
那么在Java中清理StringBuilder的最佳方法是什么呢?
当前回答
删除并不太复杂:
myStringBuilder.delete(0, myStringBuilder.length());
你还可以:
myStringBuilder.setLength(0);
其他回答
有两种方法:
使用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
这是简单的方法。
如果您查看StringBuilder或StringBuffer的源代码,setLength()调用只是重置字符数组的索引值。恕我直言,使用setLength方法总是比新分配更快。他们应该将方法命名为“clear”或“reset”,这样会更清楚。
如果性能是主要考虑的问题,那么讽刺的是,在我看来,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());
}
}