问题
我试图了解最佳实践是什么以及为什么连接不同情况下的字符串文字和变量。例如,如果我有这样的代码
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
这是这样做的吗?从this post,我注意到Strings上的+操作符创建了一个StringBuilder的新实例,连接操作数,并返回一个String转换,这似乎比调用.append()要多得多;所以,如果这是真的,那就不可能了。但是怎么样String.concat()?每次连接使用.append()是否合适?或者只是变量,文字可以附加到.concat()?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
针对这些情况的最佳实践和表现的一般规则是什么?我的假设是否正确+并且它应该真的不被使用?
#1 热门回答(162 赞)
#操作员
String s = s1 + s2
在幕后,这被翻译为:
String s = new StringBuilder(s1).append(s2).toString();
想象一下,如果你有s1 + s2,它会增加多少额外工作:
stringBuilder.append(s1 + s2)
代替:
stringBuilder.append(s1).append(s2)
##多个字符串
值得注意的是:
String s = s1 + s2 + s3 + ... +sN
被翻译成:
String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();
#concat()
String s = s1.concat(s2);
Stringcreateschar[]array,可以适合s1和s2。将s1和s2复制到此新阵列。实际上需要较少的工作然后+操作员。
#StringBuilder.append()
保持内部char[]阵列,在需要时增长。如果内部足够大,则不会创建额外的char[]。
stringBuilder.append(s1.concat(s2))
也表现不佳因为s1.concat(s2)创建了额外的char[]阵列,并且复制了s1和s2,只是为了将新的数组内容复制到internalStringBuilder``char[]。
话虽这么说你应该使用append()所有的时间并附加原始字符串(你的第一个代码片段是正确的)。
#2 热门回答(14 赞)
编译器优化连接。
所以
int a = 1;
String s = "Hello " + a;
变成了
new StringBuilder().append("Hello ").append(1).toString();
有一个很好的主题here解释了为什么你应该使用运算符。
#3 热门回答(3 赞)
优化由编译器自动完成。
Java2编译器将自动转换以下内容:
String s = s1 + s2;
至
String s = (new StringBuffer()).append(s1).append(s2).toString();
直接来自Oracles网站上的53008345。