最佳实践/性能:将 StringBuilder.append 与 String.concat 混合 +算子concat()StringBuilder.append()

我试图了解最佳实践是什么,以及为什么为不同情况串联字符串文本和变量。例如,如果我有这样的代码

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String).append("CCCCCCCCCCC").append(D_String)
    .append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");

这是这样做的方法吗?从这篇文章中,我注意到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

+算子

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

String创建可以同时适合 和 的数组。将副本和内容复制到此新阵列。实际上需要比操作员更少的工作。char[]s1s2s1s2+

StringBuilder.append()

维护一个在需要时增长的内部阵列。如果内部的足够大,则不会创建额外的内容。char[]char[]

stringBuilder.append(s1.concat(s2))

性能也很差,因为创建了一个额外的数组并复制到它,只是为了将新数组内容复制到内部。s1.concat(s2)char[]s1s2StringBuilderchar[]

话虽如此,您应该一直使用并附加原始字符串(您的第一个代码片段是正确的)。append()


答案 2

编译器优化了 + 串联。

所以

int a = 1;
String s = "Hello " + a;

转换为

new StringBuilder().append("Hello ").append(1).toString();

这里有一个很好的主题,解释了为什么你应该使用+运算符。