2

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

有人告诉我,如果连接 4 个或更多字符串,您应该使用 StringBuilder.append(),而对于其他任何事情,请使用 +。是这样吗?还是 stringbuilder 比 4 更有效的点?

4

6 回答 6

2

零。

许多年前,在一个遥远的 Java 版本(1.4)中,有人建议将连接替换为StringBuffer(线程安全的等价物StringBuilder,尚未发明)。

随着 的引入StringBuilder和对连接的重新定义,以更快的速度StringBuilder“优化”代码使用StringBuffer导致不必要的同步,而非优化代码+自动享受StringBuilder.

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

于 2013-03-19T15:06:26.663 回答
2

从 Java 1.5 开始,编译器会自动在源代码中使用StringBuilderwhen 。+

来自String 的Javadoc

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

于 2013-03-19T15:00:10.523 回答
1

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

但是有一个警告,这个:

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

产生一个字符串生成器和 5 个附加(如预期的那样)

这个; 然而:

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

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

要点:+号很好,只需将其全部堆叠在一行代码中即可。

于 2013-03-19T14:59:25.577 回答
0

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

于 2013-03-19T15:00:38.537 回答
0

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

我注意到一个很好的案例。当您需要连接时,static final String您不必使用StringBuilder. 编译器将连接它而我们的性能下降:

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;    
    } 

}

我也对这个问题很感兴趣。我试图实施一个好的测试并在这里询问。

于 2013-03-19T14:59:05.307 回答
0

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

在这种情况下,您需要避免几种情况。例如在循环中使用+ 。每次迭代StringBuilder都会创建一个新的。

可能想读这个问题

于 2013-03-19T14:59:23.640 回答