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