设置StringBuilder对象的最佳方法是什么?

时间:2018-08-15 00:23:20

标签: java stringbuilder

我创建了一个没有任何值的StringBuilder对象,然后添加了一些值。后来我想用一个完全不同的字符串替换该对象。

代码如下:

StringBuilder finalVersion = new StringBuilder();
finalVersion.append("6.0")
for (int i = 0; i < list.length(); i++) {
    if(/*...*/){
       finalVersion.append(".2");
    } else {
       finalVersion.append(".1");
    }
    if (/*...*/) {
        if (/*...*/) {
            finalVersion = new StringBuilder("Invalid parameter"));
         }
    }
}

我所做的是我创建了一个新对象来更改值,但是也许有一种更好的方法而不使用stringBuilder.setLength(0);

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

  

为解决此问题,我创建了一个新对象来更改值,但我猜想有一种更好的方法,而不使用sb.setLength(0)

这两种都是好的方法。另一个是sb.delete(0, sb.length())

当您要替换现有的字符串内容时,sb.replace(0, sb.length(), "new content")是另一种选择。

这实际上取决于您的目标是什么

  • 调用new StringBuffer(...)将为您分配一个具有默认容量或您指定容量的新分配对象。

  • setLengthdeletereplace方法将回收现有对象。这具有优点和缺点。

    • 从正面看,您不需要分配新对象 1 ...这样可以减少垃圾。

    • 在负号上,字符串缓冲区使用的空间量与以前相同,无论是否需要。另外,如果您重复执行此操作,则GC可能会占用缓冲区及其后备阵列,这会增加长期的内存负载。您可以通过调用sb.trimToSize()释放未使用的容量,但是这可能导致重新分配;即您尝试通过不使用new来避免的事情。

我的建议是使用new 除非,否则上下文表示您 不能,或者您的分析告诉您new产生了太多的垃圾。

看代码 2 ,我认为setLength比清空delete的速度要快于StringBuffer。用新内容替换内容时,它会变得更加复杂。现在您正在比较

   sb.setLength(); sb.append("new content");

   sb.replace(0, sb.length(), "new content");

需要对其进行衡量...如果您对性能的关注程度 3 ,可以将它们进行比较。


1-除非替换字符串足够大,否则缓冲区需要增长以容纳它。

2-通过阅读StringBuilderAbstractStringBuilder代码的各种版本,delete方法将始终调用System.arraycopy。但是,要了解性能影响,就需要针对StringBuilder的不同大小和不同Java版本对此进行仔细的基准测试。

3-实际上,如果您需要。提防过早优化的弊端。

答案 1 :(得分:2)

您可以使用replace。此方法不会创建新的StringBuilder对象。

builder.replace(0, b.length(), "Invalid parameter");

或者,如果您满意地使用两个语句来完成此操作,则可以先setLength(0),然后再append

但是,实际上,除非您确实遇到性能问题,否则您不必担心创建新的StringBuilder