【发布时间】:2013-03-19 14:55:55
【问题描述】:
我知道 StringBuilder 应该用于连接多个字符串,而不是使用 +。我的问题是什么是截止点?
有人告诉我,如果连接 4 个或更多字符串,您应该使用 StringBuilder.append(),而对于其他任何事情,请使用 +。 是这样吗?还是 stringbuilder 比 4 更有效的点?
【问题讨论】:
标签: java string stringbuilder
我知道 StringBuilder 应该用于连接多个字符串,而不是使用 +。我的问题是什么是截止点?
有人告诉我,如果连接 4 个或更多字符串,您应该使用 StringBuilder.append(),而对于其他任何事情,请使用 +。 是这样吗?还是 stringbuilder 比 4 更有效的点?
【问题讨论】:
标签: java string stringbuilder
从 Java 1.5 开始,当在源代码中使用 + 时,编译器会自动使用 StringBuilder。
Java 语言为字符串连接运算符 ( + ) 以及将其他对象转换为字符串提供了特殊支持。字符串拼接是通过StringBuilder(或StringBuffer)类及其append方法实现的。
【讨论】:
零。
许多年前,在遥远的 Java 版本 (1.4) 中,有人建议用 StringBuffer 替换串联(StringBuilder 的线程安全等价物,尚未发明)。
随着StringBuilder 的引入,以及在更快的StringBuilder 方面重新定义连接,使用StringBuffer 的“优化”代码会导致不必要的同步,而使用+ 的非优化代码会自动享受受益于StringBuilder。
当连接与控制结构或循环混合时,或者当我需要更新字符串中间的某些字符时,我会使用StringBuilder。否则,我假设编译器足够聪明,可以很好地处理传统的串联。
【讨论】:
从 jse 5 开始,+ 号在编译期间转换为字符串生成器。
这里有一个警告,这个:
String blam = a + b + c + d + e;
产生一个字符串生成器和 5 个附加(如预期的那样)
这个;但是:
String blam = a;
blam += b + c;
blam := d + e;
产生 3 个字符串生成器(每行一个)。
点:+号就可以了,一行代码就全部堆叠起来。
【讨论】:
我会说编译器会将加号替换为 StringBuilder 本身。
在这种情况下,您需要避免几种情况。例如在循环中使用 +。每次迭代都会创建一个新的StringBuilder。
可能想读这个question
【讨论】:
编译器非常擅长优化这些东西,所以通常你不会有太多收获。但是,例如,如果您在循环中进行连接,您可能会从使用 StringBuilder 中获得一些好处。
【讨论】:
没有定义答案,因为它取决于JVM 的实现。当我需要连接超过 3 个字符串时,我使用 StringBuilder。
我注意到一个很好的案例。当您需要连接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;
}
}
我也对这个问题很感兴趣。我试图实现一个好的测试并询问了here。
【讨论】: