2012-04-05 140 views
1

如果我做的:这是否会使StringBuilder冗余?

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

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

0

StringBuilder是可变的,但String不是。 StringBuilder使这些字符串操作更高效。 对于你的例子这样一个小的工作,你可能不会注意到不同之处。

+0

这不是更有效率。由于常数折叠,'+'运算符对于常量更有效。编译器无法以这种方式优化方法调用,因此'StringBuilder'将始终在运行时附加。在编译期间,附加了'+'的常量将被优化为单个字符串常量。 – 2012-04-10 07:56:10

4

如果这是全部您在该代码片段中使用StringBuilder,这确实没有意义。如果您在首次致电append后继续追加,则完全没有毫无意义。不过,最后一个例子比前两个例子更有意义。

我假设你的文章中的常量只是为了清晰。如果他们确实是常量,编译器会做constant folding,使得第一个例子相当于

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

常量折叠不适用于方法调用。它可以和'+'运算符一起工作。 – 2012-04-10 07:24:35

+0

@AlanEscreet我写了这个问题的第一个编辑的答案,其中OP只有两个字符串,而不是四个。 – dasblinkenlight 2012-04-10 10:32:52

+0

仍为其+1了。你的回答是绝对正确的。 :-) – 2012-04-10 10:38:10

1

综观代码编译后的输出,它使用StringBuilder的VS,简单地连接字符串代码,我发现,最新的编译器通常会无论何时适用,都可以使用StringBuilder。话虽如此,请注意,在你的第一个例子中,你需要说's = s +“hello”;为了赶上结果。

0

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

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

将被视为

sb.append("somestringhellomore stringslast one"); 

因此,将追加仅一次的StringBuilder。


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

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年左右在这个问题上做了一个小的研究,而我在这个问题上的知识可以追溯到这一点。如果自那时起还有其他改进,我不知道它。

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/