如果我这样做:
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");
答案 0 :(得分:4)
对你长期问题的简短回答是“是”。
答案 1 :(得分:4)
如果这是所有你在代码片段中使用StringBuilder
,那确实毫无意义。如果您在初次调用append
后继续追加,那么它完全毫无意义。不过,你的最后一个例子比前两个更有意义。
我认为你帖子中的常量只是为了清晰起见。如果它们确实是常量,编译器将执行constant folding,使第一个示例等效于
StringBuilder sb = new StringBuilder();
sb.append("somestringhello");
答案 2 :(得分:2)
StringBuilder
和StringBuffer
而不是字符串“+”操作。如:
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
。
有许多来源,但是; this和this都可以。我在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
。
两个主要区别是:
当您在示例中连接一组文字时。常量折叠将在编译时将这些单独的字符串转换为单个字符串,从而避免在运行时执行此操作。
"somestring" + "hello" + "more strings" + "last one"
变为"somestringhellomore stringslast one"
在循环或其他分支结构中连接时。使用+
将创建多个StringBuilder
实例,这些实例将在运行时使用更多内存和处理能力。 (见http://nicklothian.com/blog/2005/06/09/on-java-string-concatenation/)