我知道StringBuilder应该用于连接多个字符串而不是使用+。我的问题是截止点是什么?
我被告知如果连接4个或更多字符串,你应该使用StringBuilder.append(),而对于其他任何东西,使用+。 是这样的吗?或者是stringbuilder的效率是否超过4?
答案 0 :(得分:2)
从Java 1.5开始,当源代码中使用StringBuilder
时,编译器会自动使用+
。
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中获得一些好处。