Java:String concat vs StringBuilder - 优化了,我该怎么办?

标签 java string append concatenation stringbuilder

this answer ,它说(暗示)字符串连接无论如何都优化为 StringBuilder 操作,所以当我编写代码时,有什么理由在源代码中编写 StringBuilder 代码吗?请注意,我的用例与 OP 的问题不同,因为我正在连接/append 数十万行。

为了让自己更清楚:我很清楚它们之间的差异,只是我不知道是否值得真正编写 StringBuilder 代码,因为它的可读性较差,而且它的表亲,String 类,应该是无论如何都会在编译过程中自动转换。

最佳答案

我认为 StringBuilder+ 的使用确实取决于您使用它的上下文。

一般使用 JDK 1.6 及以上版本的编译器会自动使用 StringBuilder 将字符串连接在一起。

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

这会将字符串三编译为:

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 程序反编译代码,该程序会输出字节码。它相当容易解释,并且在尝试优化代码时通常是一个有用的引用。编译器确实会在幕后更改您的代码,所以看看它做了什么总是很有趣!

关于Java:String concat vs StringBuilder - 优化了,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14927630/

相关文章:

android - 在 Android 中删除 xml 字符串

java - 如何 append 到 Java 中的 DataOutputStream?

javascript - 正则表达式替换和追加字符串

JavaScript 正则表达式和 "string literal"

java - 如何从字符串数组创建词汇表

javascript - 添加和删​​除 jquery li 元素

java - 将现有的 JAR 转换为 OSGi 包

java - Spring Boot无法连接MySql

java - 如何调用枚举函数?

java - 加载程序约束违规