首页 文章

如何清除或清空StringBuilder? [重复]

提问于
浏览
514

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

我在一个循环中使用StringBuilder并且我想要清空每个x次迭代并以空 StringBuilder 开头,但我在文档中看不到任何与.NET StringBuilder.Clear类似的方法,只是delete方法似乎过度了复杂 .

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

9 回答

  • 2

    delete 并不过分复杂:

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

    你也可以这样做:

    myStringBuilder.setLength(0);
    
  • 69

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

  • 24

    两种工作方式:

    • 使用 stringBuilderObj.setLength(0) .

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

  • 276

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

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

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

  • 591

    我将投票支持 sb.setLength(0); ,不仅因为它是一个函数调用,而且 because it doesn't actually copy the array into another array 就像 sb.delete(0, builder.length()); . 它只是将剩余的字符填充为0并将长度变量设置为新的长度 .

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

  • 15
    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
    

    是简单的方法 .

  • 4

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

    有关性能,请参阅此相关帖子:Is it better to reuse a StringBuilder in a loop?

  • 2

    我认为这里的许多答案可能缺少 StringBuilder 中包含的质量方法: .delete(int start, [int] end) . 我知道这是一个迟到的回复;然而,这应该是已知的(并且更详细地解释) .

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

    StringBuilder table = new StringBuilder();
    

    如果您循环遍历该方法并更改内容,请使用该内容,然后希望将内容丢弃到"clean up"以进行下一次迭代,您可以删除它的内容,例如

    table.delete(int start, int end).
    

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

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

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

  • 4

    如果性能是主要考虑因素......具有讽刺意味的是(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());
        }
    }
    

相关问题