java:字节码中的字符串concat转换为StringBuilder
我用javac命令行查看了编译后的代码,每当我使用带+运算符的字符串连接时,编译后的代码都会被StringBuilder的append()方法替换。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
现在我认为使用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类或类似技术来减少通过表达式求值创建的中间字符串对象的数量