又一次在字符串追加 vs concat vs +

2022-09-01 09:53:09

可能是我在劈头发,但我想知道在以下情况下:

String newString = a + b + c;  //case 1


String newString = a.concat(b).concat(c);   //case 2

StringBuilder newString = new StringBuilder(); //case 3
newString.append(a);
newString.append(b);    
newString.append(c);

哪个是最好的使用?

无论如何,我的意思是最好的。

读到这些,其他帖子说情况3不是最佳性能明智的,其他人的情况1将最终出现在情况3等。

更具体地说。

例如,撇开所有东西,如果你必须维护他的代码,哪种风格更适合从另一个程序员那里看到它?

或者您认为哪个编程效率更高?
或者你会认为更快等。

我不知道该如何表达这一点。

例如,像案例3这样的答案可以更快,但绝大多数程序员更喜欢案例1,因为它最易读,如果它以某种方式精心阐述,也会被接受。


答案 1

案例1简明扼要,意图表达清晰,等同于案例3。

案例 2 效率较低,可读性也较差。

案例 3 的效率几乎与案例 1 一样高,但更长,可读性更差。

仅当必须在循环中连接时才使用案例 3 更好。否则,编译器会将情况 1 编译为情况 3(除了它构造 StringBuilder with ),这使得它比您的情况 3 更有效)。new StringBuilder(a)


答案 2

案例 3 是性能最高的形式,但 JVM 将案例 1 转换为案例 3。

但我认为案例2是最糟糕的,它不像案例1那样可读,也不像案例3那样执行。

如果你想在循环中连接字符串,只需用例3,你可以很容易地测试性能增益,但如果它不是在循环中(或者你没有在序列中追加很多字符串),它们几乎是相同的。

您不得使用 + 运算符的情况是:

String a = "";
for (String x : theStrings) {
    a += x;
}

String a = b + c;
a = a + d;
a = a + e;
a = a + f;