这会使StringBuilder的冗余使用吗?

时间:2012-04-05 15:07:59

标签: java string immutability stringbuilder redundancy

如果我这样做:

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");

7 个答案:

答案 0 :(得分:4)

对你长期问题的简短回答是“是”。

答案 1 :(得分:4)

如果这是所有你在代码片段中使用StringBuilder,那确实毫无意义。如果您在初次调用append后继续追加,那么它完全毫无意义。不过,你的最后一个例子比前两个更有意义。

我认为你帖子中的常量只是为了清晰起见。如果它们确实是常量,编译器将执行constant folding,使第一个示例等效于

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");

答案 2 :(得分: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();
}

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

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

答案 3 :(得分:1)

查看使用StringBuilder的代码的编译输出与简单连接字符串的代码,我发现最新的编译器通常会使用StringBuilder,无论它是否合适。话虽如此,请注意在你的第一个例子中,你需要说's = s +“hello”;为了抓住结果。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

将被视为

sb.append("somestringhellomore stringslast one");

因此它只会向StringBuilder附加一次。


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

答案 6 :(得分: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/