java:字节码中的字符串concat转换为StringBuilder

时间:2013-03-18 22:20:45

标签: java string jvm stringbuilder javap

我用javac命令行查看了我的编译代码,每当我使用String运算符+运算符时,我就会看到,编译后的代码被StringBuilder的append()方法替换。 现在我认为使用StringBuilder和String连接具有相同的性能,因为它们具有相似的字节码,是否正确?

2 个答案:

答案 0 :(得分:13)

是的,这是真的!但是当你在循环中连接时,行为会有所不同。例如

String str = "Some string";
for (int i = 0; i < 10; i++) {
  str += i;
}

new StringBuilder将在每个循环迭代中构建(初始值为str),并且在每次迭代结束时,将与初始String(实际为StringBuilder并联,初始值为{ {1}})。
因此,只有在循环中使用字符串连接时才需要自己创建StringBuilder。

答案 1 :(得分:0)

主要区别(以及编译器使用StringBuilder进行字符串连接的原因)是String是不可变的,而StringBuilder则不是。

例如,仅使用字符串计算s1 + s2 + s3需要复制s1个字符两次。使用StringBuilder可以(并且可以)避免这种情况。

JLS

明确允许此优化
  

实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间String对象。为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似技术来减少通过计算表达式创建的中间String对象的数量。