再次对弦追加vs concat vs +

Cra*_*lus 26 java string performance coding-style

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

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);
Run Code Online (Sandbox Code Playgroud)

哪个最好用?

我最好的意思是任何方式.

阅读这些,其他帖子说案例3不是最佳表现明智,其他案例1案例1将最终在案例3等.

更具体.

例如,将所有设置放在一边,如果你必须维护他的代码,那么哪种风格更适合从另一个程序员那里看到它?

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

我不知道怎么表达这个.

像案例3这样的答案可能会更快,但绝大多数程序员更喜欢案例1,因为如果它在某种程度上得到了很好的阐述,它也是最可读的

JB *_*zet 23

案例1简洁明了,表达了意图,相当于案例3.

案例2的效率较低,而且可读性较差.

案例3几乎与案例1一样有效,但更长,更不易读.

使用案例3只有在必须在循环中连接时才能使用.否则,编译器将情况1编译为情况3(除了它构造StringBuilder new StringBuilder(a)),这使得它比你的情况3)更有效.

  • 首先,我用Java编程已经超过14年,阅读技术文章,参与Java新闻组等等.你在很长一段时间内学到了很多东西.其次,这个问题是经典问题.第三,源代码确实可用.第四,使用`javap -c Test.class`可以发现编译器如何编译`s = a + b + c`. (3认同)
  • +1:案例2创建了一个临时对象,就像其他情况一样,所以我不清楚它的效率低,但同意它最不可能清楚.(部分原因是它最常用) (2认同)
  • 编译器不会将案例1编译为案例3,但JVM会在运行时将案例1转换为案例3. (2认同)

Ami*_*deh 7

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

但我认为案例2是最差的,它不像案例1那样可读,而不像案例3那样表现.

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

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

String a = "";
for (String x : theStrings) {
    a += x;
}
Run Code Online (Sandbox Code Playgroud)

要么

String a = b + c;
a = a + d;
a = a + e;
a = a + f;
Run Code Online (Sandbox Code Playgroud)