StringBuilder
开始,但是在文档中我没有看到类似于 .NET 的StringBuilder.Clear方法,只有delete方法,看起来过于复杂。
那么,在Java中清空一个 StringBuilder
的最佳方式是什么?
StringBuilder
开始,但是在文档中我没有看到类似于 .NET 的StringBuilder.Clear方法,只有delete方法,看起来过于复杂。
那么,在Java中清空一个 StringBuilder
的最佳方式是什么?
两种可行的方法:
stringBuilderObj.setLength(0)
。new StringBuilder()
来分配一个新的对象,而不是清空缓冲区。注意,在对性能非常关键的代码路径进行优化时,这种方法可能比基于 setLength
的方法慢得多(因为需要分配一个带有新缓冲区的新对象,旧对象变得可以被GC回收等)。基本上有两种选择,使用 setLength(0)
重置 StringBuilder 或在每次迭代中创建一个新的 StringBuilder。根据使用情况,两者都有利弊。
如果您预先知道 StringBuilder 的期望容量,则每次创建一个新的 StringBuilder 应该与设置新长度一样快。这也有助于垃圾收集器,因为每个 StringBuilder 的生命周期相对较短,垃圾收集器也针对此进行了优化。
当您不知道容量时,复用同一个 StringBuilder 可能更快。每次添加时超过容量后,都必须分配一个新的后备数组并复制以前的内容。通过重用同一个 StringBuilder,在一些迭代后它将达到所需的容量,之后就不会有任何复制了。
StringBuilder
更好的情况吗? - iczadelete
并不是特别复杂:
myStringBuilder.delete(0, myStringBuilder.length());
你也可以这样做:
myStringBuilder.setLength(0);
new
吗?例如 function(new StringBuilder())
然后每个函数调用都会创建一个新的分配,不是吗? - Davos如果您查看StringBuilder或StringBuffer的源代码,setLength()方法只是重置了字符数组的索引值。在我看来,使用setLength()方法总是比进行新的分配更快。他们应该将这个方法命名为“清除”或“重置”,这样就更清晰明了。
我会选择 sb.setLength(0);
不仅因为它只需要一次函数调用,而且它不像 sb.delete(0, builder.length());
那样将数组复制到另一个数组中。 它只是填充剩余的字符为 0 并将长度变量设置为新的长度。
您可以查看他们的实现来验证我的观点,从此处的 setLength
函数和 delete0
函数。
您应该使用sb.delete(0, sb.length())
或sb.setLength(0)
,而不是创建一个新的StringBuilder()。
有关性能方面的信息,请参见此相关帖子:在循环中重用StringBuilder是否更好?
我认为这里许多答案可能忽略了StringBuilder
中包含的一个高质量方法:.delete(int start, [int] end)
。我知道这是一个晚回复,但这应该被公开(并更详细地解释一下)。
假设您有一个希望在程序中动态修改的StringBuilder
表格(我正在处理的一个程序就是这样),例如:
StringBuilder table = new StringBuilder();
如果你正在循环执行该方法并修改内容,使用该内容后,希望将内容丢弃以“清理”StringBuilder
以进行下一次迭代,你可以删除其内容,例如:
table.delete(int start, int end).
如果您想删除的字符的起始和结束索引已知,可以使用这个方法。但是如果您不知道字符的长度并且希望将整个字符都删除怎么办?
table.delete(0, table.length());
StringBuilders
会产生很多开销(并可能导致线程安全问题); 因此,如果您的 StringBuilder
用于与用户进行交互,请使用 StringBuffer
- 它与 StringBuilder
相同(有一些例外)。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());
}
}
strBldr.trimToSize();
会在设置长度后释放任何未使用的空间。不幸的是,如果该对象经常被使用,那么你只会导致内存波动,因此最好在使用 .setLength(0)
之前使用它,而不是之后。 - Chinoto VokroStringBuilder 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
if (count < newLength)
,但如果newLength
为0,这种情况永远不会发生。 - biziclop