为什么在Java中使用StringBuffer而不是字符串串联运算符

2022-08-31 16:00:51

有人告诉我,在Java中使用连接字符串比使用运算符更有效。当你这样做时,引擎盖下会发生什么?有什么不同之处?StringBuffer+StringStringBuffer


答案 1

现在最好使用StringBuilder(它是一个不同步的版本;你什么时候并行构建字符串?),几乎在每种情况下,但以下是发生的事情:

当您将 + 与两个字符串一起使用时,它会编译如下代码:

String third = first + second;

对于这样的事情:

StringBuilder builder = new StringBuilder( first );
builder.append( second );
third = builder.toString();

因此,对于小例子,它通常不会有什么不同。但是,当您构建一个复杂的字符串时,您通常还有更多要处理的内容。例如,您可能正在使用许多不同的追加语句,或者类似如下的循环:

for( String str : strings ) {
  out += str;
}

在这种情况下,每次迭代都需要一个新实例和一个新实例(- s 的新值是不可变的)。这是非常浪费的。用单个替换它意味着您可以只生产单个,而不会用您不关心的填充堆。StringBuilderStringoutStringStringBuilderStringString


答案 2

对于简单的串联,例如:

String s = "a" + "b" + "c";

使用起来毫无意义 - 正如jodonnell指出的那样,它将被巧妙地翻译成:StringBuffer

String s = new StringBuffer().append("a").append("b").append("c").toString();

但是,在循环中连接字符串是非常不可行的,例如:

String s = "";
for (int i = 0; i < 10; i++) {
    s = s + Integer.toString(i);
}

在此循环中使用 string 将在内存中生成 10 个中间字符串对象:“0”、“01”、“012”等。在使用编写相同内容时,您只需更新一些内部缓冲区,并且不会创建那些不需要的中间字符串对象:StringBufferStringBuffer

StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
    sb.append(i);
}

实际上,对于上面的示例,您应该使用(在Java 1.5中引入)而不是 - 稍微重一些,因为它的所有方法都是同步的。StringBuilderStringBufferStringBuffer


推荐