4

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

4

2 回答 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 回答