Java:String concat与StringBuilder-已优化,所以我该怎么办?

在此答案中,它表示(暗示)无论如何都将String连接优化到StringBuilder操作中,因此,当我编写代码时,是否有任何理由在源代码中编写StringBuilder代码? 请注意,我的用例与OP的问题不同,因为我要串联/附加数十万行。

为了使自己更清楚:我很清楚每个代码的区别,只是我不知道是否值得实际编写StringBuilder代码,因为它的可读性较低,并且当它的较慢的表兄弟String类自动转换为 反正编译过程。

Soyuz asked 2020-06-24T04:22:29Z
4个解决方案
112 votes

我认为对javapjavap的使用实际上取决于您在其中使用的上下文。

通常使用JDK 1.6及更高版本,编译器将使用javap自动将字符串连接在一起。

String one = "abc";
String two = "xyz";
String three = one + two;

这将编译为javap为:

String three = new StringBuilder().append(one).append(two).toString();

这非常有帮助,为我们节省了一些运行时间。 但是,此过程并不总是最佳的。 举个例子:

String out = "";
for( int i = 0; i < 10000 ; i++ ) {
    out = out + i;
}
return out;

如果我们编译为字节码,然后反编译生成的字节码,则会得到类似以下内容的信息:

String out = "";
for( int i = 0; i < 10000; i++ ) {
    out = new StringBuilder().append(out).append(i).toString();
}
return out;

编译器已经优化了内部循环,但是当然没有进行最佳的优化。 为了改善我们的代码,我们可以使用:

StringBuilder out = new StringBuilder();
for( int i = 0 ; i < 10000; i++ ) {
    out.append(i);
}
return out.toString();

现在,这比编译器生成的代码更理想,因此,在需要高效代码的情况下,绝对需要使用javap/StringBuffer类编写代码。 当前的编译器不能很好地处理循环中的串联字符串,但是将来可能会改变。

您需要仔细查看以了解需要在哪里手动应用javap,并尝试在不会降低代码可读性的地方使用它。

注意:我使用JDK 1.6编译了代码,并使用javap程序反编译了该代码,该程序吐出了字节代码。 它很容易解释,并且在尝试优化代码时经常是有用的参考。 编译器确实会在后台更改您的代码,因此查看它的作用总是很有趣!

Tom Cammann answered 2020-06-24T04:23:21Z
3 votes

您的问题中的关键短语是“应该更慢”。 您需要确定这是否确实是瓶颈,然后查看哪个更快。

如果您要编写此代码,但尚未编写,则编写对您更清楚的内容,然后如有必要,请查看它是否是瓶颈。

尽管使用代码看起来更合理,但您认为更可能更快,但如果两者均具有相同的可读性,则实际上需要时间来找出不需要的代码,这是浪费时间。 高于性能的可读性,直到性能无法接受为止。

jmoreno answered 2020-06-24T04:23:51Z
2 votes

这要视情况而定,但是StringBuilder被认为要快一些。 如果您在循环内进行串联,那么我建议您使用StringBuilder。

无论如何,我建议您对代码进行概要分析和基准测试(如果您要进行如此大量的附加操作)。

但是要当心:StringBuilder的实例是可变的,并且不要在线程之间共享(除非您真的知道自己在做什么。)与不可变的String相对。

bssstudio answered 2020-06-24T04:24:20Z
0 votes

我可能误解了您的问题,但是在附加字符串时,StringBuilder的速度更快。 因此,是的,如果要追加“数十万行”,则绝对应使用StringBuilder(如果正在运行多线程应用程序,则应使用StringBuffer)。

(评论中更详尽的答案)

cldjr answered 2020-06-24T04:24:45Z
translate from https://stackoverflow.com:/questions/14927630/java-string-concat-vs-stringbuilder-optimised-so-what-should-i-do