提问:如何清空StringBuilder?
我在循环中使用StringBuilder,每X次迭代我都想清空它,并从一个空的StringBuilder开始,但我看不到任何类似于.NET中的StringBuilder.CLEAR方法。文档中的delete()看起来过于复杂
那么在Java中清除StringBuilder的最佳方法是什么呢?
回答一
基本上有两种选择
setLength(0)重置StringBuilder
在每次迭代中创建一个新的StringBuilder。
两者都有优点和缺点,这取决于你的用法
如果你事先知道StringBuilder的预期容量,那么每次创建一个新的StringBuilder应该和设置一个新长度一样快。它还将有助于垃圾回收,因为每个StringBuiler的寿命都相对较短,gc为此进行了优化。
如果你不知道容量时,重用同一个StringBuilder可能会更快。每次追加超出容量时,都必须分配一个新数组,并把以前的内容复制到新数组上去。通过重用StringBuilder,它将在一些迭代之后到达所需的容量,并且此后不会有任何数组复制。
回答二
我认为这里的许多答案可能缺少StringBuilder中包含的一个高质量方法:delete(int start, int end)。
现在假设你有一个变量StringBuilder table,你希望在程序中动态的修改它(我现在正在做的一个需求就这样子的)
StringBuilder table = new StringBuilder();
如果你在循环方法中希望使用StringBuilder对象,用完后清理StringBuilder以供下次使用
table.delete(int start, int end).
开始和结束是你希望删除的字符索引,如果不知道字符长度,想删除所有内容呢?
table.delete(0, table.length());
StringBuilder在频繁更改时会占用大量开销,并会导致线程安全方面的问题。如果你的接口面向用户,请使用功能与StringBuilder相似的StringBuffer
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.你学会了吗?
想要获得更多关于StringBuilder的资料,彻底吃透,可以私信我关键词[资料],或者看下方,获取更多java相关知识.
~联系方式~
wechat: Mlzg5201314zz
扣扣:2967728282///
网友评论