我用 javac 命令行查看了我的编译代码,我看到每当我使用 + 运算符进行字符串连接时,编译代码都会被 StringBuilder 的 append() 方法替换。现在我认为使用 StringBuilder 和 String 连接具有相同的性能,因为它们具有相似的字节码,对吗?
问问题
1804 次
2 回答
13
是的,这是真的!但是当您在循环中连接时,行为会有所不同。例如
String str = "Some string";
for (int i = 0; i < 10; i++) {
str += i;
}
newStringBuilder
将在每次循环迭代时构造(初始值为 str),并且在每次迭代结束时将与初始 String 连接(实际上StringBuilder
初始值为str
)。
因此,只有在循环中使用字符串连接时,您才需要自己创建 StringBuilder。
于 2013-03-18T22:25:23.290 回答
0
主要区别(以及编译器StringBuilder
用于字符串连接的原因)String
是不可变的,而StringBuilder
不是。
例如,s1 + s2 + s3
单独使用字符串进行计算需要将s1
' 字符复制两次。这可以(并且是)通过使用来避免StringBuilder
。
JLS明确允许这种优化:
实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间 String 对象。为了提高重复字符串连接的性能,Java 编译器可以使用 StringBuffer 类或类似技术来减少通过评估表达式创建的中间字符串对象的数量。
于 2013-03-18T22:25:26.893 回答