java 清空string_java - 如何清除或清空StringBuilder?

java - 如何清除或清空StringBuilder?

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

循环后清除字符串缓冲区/构建器                                     8个答案

我在一个循环中使用一个StringBuilder,每个x迭代我要清空它并以一个空的StringBuilder开头,但我在文档中看不到任何类似于.NET StringBuilder.Clear的方法,只是删除方法 看起来过于复杂。

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

9个解决方案

586 votes

两种工作方式:

使用new StringBuilder()。

使用new StringBuilder()分配新的,而不是清除缓冲区。

Marcus Frödin answered 2019-03-29T10:50:30Z

276 votes

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

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

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

Jörn Horstmann answered 2019-03-29T10:51:11Z

69 votes

delete并不过分复杂:

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

你也可以这样做:

myStringBuilder.setLength(0);

krtek answered 2019-03-29T10:51:46Z

24 votes

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

Javamann answered 2019-03-29T10:52:15Z

15 votes

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

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

Ahmed Hegazy answered 2019-03-29T10:53:06Z

4 votes

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

是简单的方法。

javaddroid answered 2019-03-29T10:53:44Z

4 votes

您应该使用sb.delete(0, sb.length())或sb.setLength(0)并且不要创建新的StringBuilder()。

请参阅此相关帖子了解性能:在循环中重用StringBuilder会更好吗?

Tony Meng answered 2019-03-29T10:54:28Z

2 votes

我想这里的许多答案可能都缺少StringBuilders:StringBuffer中包含的质量方法。我知道这是一个迟到的回复; 然而,这应该是已知的(并且更详细地解释)。

假设您有一个StringBuilder表 - 您希望在整个程序中动态修改它(我现在正在处理的那个),例如,

StringBuilder table = new StringBuilder();

如果您循环浏览方法并更改内容,请使用内容,然后希望丢弃内容以“清理”StringBuilders以进行下一次迭代,您可以删除它的内容,例如

table.delete(int start, int end).

开始和结束是您要删除的字符的索引。 不知道字符的长度,想删除整个东西?

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

现在,对于踢球者。 StringBuilders,如前所述,经常更改会占用大量开销(并且可能导致线程安全问题); 因此,使用StringBuffer - 与StringBuilder相同(除了少数例外) - 如果您的StringBuilder用于与用户连接。

Thomas answered 2019-03-29T10:56:01Z

2 votes

如果性能是主要考虑因素......具有讽刺意味的是(IMO)用于格式化进入缓冲区的文本的Java构造在CPU上比在alloc / realloc / garbage集合上耗费更多时间......好吧,可能 不是GC取决于您创建和丢弃的构建器数量。

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

而且,实际上,如果StringBuilder涉及的内容复杂而冗长且比简单的String str = "Hi";更长(更不用说Java可能在后台使用构建器)。

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

}

}

DevByStarlight answered 2019-03-29T10:57:06Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值