Java - 有多少字符串连接应该提示使用StringBuilder?

时间:2013-03-19 14:55:56

标签: java string stringbuilder

我知道StringBuilder应该用于连接多个字符串而不是使用+。我的问题是截止点是什么?

我被告知如果连接4个或更多字符串,你应该使用StringBuilder.append(),而对于其他任何东西,使用+。 是这样的吗?或者是stringbuilder的效率是否超过4?

6 个答案:

答案 0 :(得分:2)

从Java 1.5开始,当源代码中使用StringBuilder时,编译器会自动使用+

来自Javadoc for String

  

Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。字符串连接是通过StringBuilder(或StringBuffer)类及其追加方法实现的。

答案 1 :(得分:2)

<强>零。

许多年前,在远离Java的Java版本(1.4)中,有些人建议用StringBuffer(线程安全等效的StringBuilder替换连接,但尚未发明)。

引入StringBuilder,并根据不需要的同步中使用StringBuilder的更快StringBuffer,“优化”代码重新定义连接,而非最佳代码+被自动享受StringBuilder的好处。

当串联与控制结构或循环混合时,或者当我需要更新字符串中间的某些字符时,我会使用StringBuilder。否则我认为编译器足够聪明,可以很好地完成传统的连接。

答案 2 :(得分:1)

从jse 5开始,+符号在编译期间转换为stringbuilder。

但是有一点需要注意:

String blam = a + b + c + d + e;

导致一个stringbuilder和5个追加(如预期的那样)

此;但是:

String blam = a;
blam += b + c;
blam := d + e;

产生3个字符串构建器(每行一个)。

要点:+符号没问题,只需将其全部堆叠在一行代码中即可。

答案 3 :(得分:0)

没有定义的答案,因为它取决于JVM实施。当我需要连接超过3个字符串时,我使用StringBuilder

我注意到一个很好的案例。当您需要连结static final String时,您不必使用StringBuilder。 compliler会以性能下降来结束:

final class Example {

    public static final String STRING_ONE = "string";
    public static final String STRING_TWO = "string";
    public static final String STRING_THREE = "string";
    public static final String STRING_FOUR = "string";

    public String getBigString() {
        return STRING_ONE + STRING_TWO + STRING_THREE + STRING_FOUR;    
    } 

}

此外,我对这个问题很感兴趣。我试着实施一个好的测试并询问here

答案 4 :(得分:0)

我想说编译器会用StringBuilder替换加号。

在这种情况下,您希望避免几种情况。例如,在循环中使用 + 。对于每次迭代,将创建一个新的StringBuilder

可能想看看这个question

答案 5 :(得分:0)

编译器非常擅长优化这些东西,所以通常情况下,你不会获得太多收益。但是如果你在循环中进行连接,你可能会从使用StringBuilder中获得一些好处。