Java的:使用concat VS StringBuilder的 - 优化的,所以我应该怎么办?(J

2019-07-20 01:58发布

在这个答案 ,它说(暗示),该字符串连接无论如何优化为StringBuilder的操作,所以当我写我的代码,没有任何理由在源写StringBuilder的代码? 请注意,我用例是从OP的问题不同,因为我串联/附加线的几百到几千。

为了让自己更清楚:我清楚地感知有关每个差异,只是我不知道它的价值实际编写StringBuilder的代码,因为它的可读性和当其理应较慢的同类,String类,是自动的转换反正编译过程。

Answer 1:

我认为使用StringBuilder VS +真的取决于你使用它的上下文。

一般使用JDK 1.6和编译器上面会自动连接在一起使用字符串StringBuilder

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

这将编译String three为:

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

现在,这是比编译器生成的代码更优化的,所以肯定是有需要使用编写代码StringBuilder / StringBuffer在需要高效的代码情况下类。 目前的编译器是不是在循环处理连接字符串很大,但是这可能会在未来改变。

你需要仔细看看,看看你需要手动应用StringBuilder ,并尝试使用它,它不会降低你的代码的可读性了。

注:我使用JDK 1.6编译代码,并使用反编译代码javap程序,它吐出来的字节码。 这是相当容易理解,并且经常看试图优化代码时,在一个有益的参考。 编译器不会改变在幕后,你的代码,因此它总是有趣的,看看它做什么!



Answer 2:

在你的问题的关键短语是“所谓慢”。 你需要确定,如果这确实是一个瓶颈,然后看看这是更快。

如果你即将写代码,但还没有写它,然后写什么更清楚你,然后如果necessay看它是否是一个瓶颈。

虽然是有意义的使用你考虑更多LIKEY以更快的代码,如果两者同样都是可读的,居然抽出时间来找出哪些是当你没有一个需要更快的是在浪费时间。 可读性以上性能,直到性能是不可接受的。



Answer 3:

这要看情况,但StringBuilder的被认为是有点快。 如果你正在做一个循环内串联,那么我会建议你使用StringBuilder。

无论如何,我会建议您分析和基准测试代码(如果你正在做这样一个庞大的append)。

不过要小心:StringBuilder的实例是可变的,并且不被线程之间共享的(除非你真的知道自己在做什么。),而不是字符串,是不可改变的。



Answer 4:

我可能误解了你的问题,但StringBuilder的速度更快附加字符串时。 所以,是的,如果你是追加“几百到几千行”,你一定要(如果正在运行多线程应用程序或StringBuffer的)使用StringBuilder。

(注释中更完整的答案)



文章来源: Java: String concat vs StringBuilder - optimised, so what should I do?