1

如果我做:

StringBuilder sb = new StringBuilder();
sb.append("somestring" + "hello" + "more strings" + "last one");

是否与以下内容相同:

string s = "somestring";
s + "hello" + "more strings" + "last one";

它会使使用字符串生成器毫无意义吗?从而需要使用:

StringBuilder sb = new StringBuilder();
sb.append("somestring");
sb.append("hello");
sb.append("more strings");
sb.append("last one");
4

7 回答 7

4

您的长问题的简短回答是“是”。

于 2012-04-05T15:11:04.047 回答
4

如果这是您在该代码片段中的全部用途StringBuilder,那确实毫无意义。如果您在初始调用后继续附加append,那么它并非完全没有意义。不过,您的最后一个示例比前两个更有意义。

我假设您帖子中的常量只是为了清楚起见。如果它们确实是常量,编译器将进行常量折叠,使第一个示例等效于

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");
于 2012-04-05T15:11:37.550 回答
2

StringBuilderStringBuffer当您将多次附加元素时,应该使用而不是字符串“+”操作。如:

String s = new String();
for(int i=0; i < x; i++){
  s += i;
}

因为这将被转换为(类似的东西):

String s = new String();
for(int i=0; i < x; i++){
   StringBuffer sb = new StringBuffer();
   sb.append(s);
   sb.append(i)
   s = sb.toString();
}

在每次迭代中(在等效字节码内),您正在创建 aStringBuffer并将其转换为String.

有很多来源,但即;这个这个都可以。我在 2010 年左右对这个问题做了一个小研究,我对这个问题的了解可以追溯到那个时候。如果从那时起还有其他改进,我不知道。

于 2012-04-05T15:24:53.983 回答
1

查看使用 StringBuilder 的代码与仅连接字符串的代码的编译输出,我发现最新的编译器通常会使用 StringBuilder,无论何时合适。话虽如此,请注意,在您的第一个示例中,您需要说 's = s + "hello"; 为了捕捉结果。

于 2012-04-05T15:15:09.267 回答
0

根据String javadocs+操作符被转换为StringBuilder反正。

两个主要区别是:

  1. 当您像在示例中那样连接一组文字时。常量折叠将在编译时将这些单独的字符串转换为单个字符串,从而避免在运行时执行此操作。

    "somestring" + "hello" + "more strings" + "last one"变成"somestringhellomore stringslast one"

  2. 当您在循环或其他分支结构中连接时。使用+将创建多个StringBuilder实例,这些实例将在运行时使用更多内存和处理能力。(见http://nicklothian.com/blog/2005/06/09/on-java-string-concatenation/

于 2012-04-10T07:19:02.627 回答
0

StringBuilder 是可变的,但 String 不是。StringBuilder 使这些字符串操作更加高效。对于像您的示例这样的小作品,您可能不会注意到差异。

于 2012-04-05T15:11:17.700 回答
0

在第一种情况下,固定文字将被编译器检测到,并将作为单个值内联。喜欢

sb.append("somestring" + "hello" + "more strings" + "last one");

将被视为

sb.append("somestringhellomore stringslast one");

所以它只会追加一次到 StringBuilder。


在第二种情况下,它会附加多次。

于 2012-04-05T15:16:17.110 回答