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

java:字节码中的字符串concat转换为StringBuilder,java,string,jvm,stringbuilder,javap,Java,String,Jvm,Stringbuilder,Javap,我用javac命令行查看了编译后的代码,每当我使用带+运算符的字符串连接时,编译后的代码都会被StringBuilder的append()方法替换。 现在我认为使用StringBuilder和字符串连接具有相同的性能,因为它们具有相似的字节码,对吗?是的,这是真的!但当您在循环中连接时,行为会有所不同。e、 g. String str = "Some string"; for (int i = 0; i < 10; i++) { str += i; } String str=“Som

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

是的,这是真的!但当您在循环中连接时,行为会有所不同。e、 g.

String str = "Some string";
for (int i = 0; i < 10; i++) {
  str += i;
}
String str=“Some String”;
对于(int i=0;i<10;i++){
str+=i;
}
新的
StringBuilder
将在每次循环迭代(初始值为str)时构造,并且在每次迭代结束时,将与初始字符串(实际上
StringBuilder
初始值为
str
)连接。
因此,只有在循环中使用字符串连接时,您才需要自己创建StringBuilder。

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

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

此优化是由以下方面明确允许的:

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