Java字符串拼接的效率问题

25
这个有问题吗? (想象它更大)
int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;

或者使用StringBuilder/StringBuffer更好吗?

8个回答

39

这篇文章怎么样? - gaheinrichs
当您在循环中连接字符串时,编译器无法自动替换为 StringBuilder,这时您应该考虑从连接转换为 StringBuilder。 - user765635
1
只有在循环中进行字符串拼接时,编译器才无法自动替换为 StringBuilder。这时候你应该考虑从字符串拼接转换为使用 StringBuilder。 - Trunk

7

不,没问题。如果你使用Sun的Java 6编译器,它实际上会使用StringBuilder。

阅读此文章


7

Java 5.0中,StringBuffer的Javadoc指出:

通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但是由于不执行同步,因此更快。

编译器将合并字符串文字,因此与编写以下内容相同。

String myString = "this is my stringand " + this.methodCall() + " answer is : " + count;

这与

String myString = new StringBuilder().append("this is my stringand ").append(methodCall()).append(" answer is : ").append(count).toString();

我认为你不需要担心性能问题,除非你需要清除系统中的垃圾,但此时你不会在这里使用字符串。(这种情况发生的可能性非常小)


3

如果您使用 StringBuilder/StringBuffer(根据应用程序线程模型选择)编写代码,那么它将更易读。

例如:

    String str = "abc";
    str+="def";

在内部,它将创建相同的StringBuilder

   7:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   10:  aload_1
   11:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:  ldc #6; //String def
   16:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:  astore_1

3

(想象它更大)...

使用"+"运算符进行字符串连接会创建许多临时对象并增加垃圾回收。使用StringBuffer类更有效率。

更多信息请参见:http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html

StringBuffer strBuf = new StringBuffer();
strBuf.append("this");
strBuf.append("is");
strBuf.append("my");
strBuf.append("string");
strBuf.append("and");
strBuf.append(this.methodCall());
strBuf.append(" answer ");
strBuf.append("is : ");
strBuf.append(count);

可以相关: 字符串拼接:concat() vs "+" 运算符


是的,但仅限于您在循环中拼接字符串而不是一次性构建字符串的情况下才会这样。 - Mark W
3
引用 您的来源 总是有帮助的。 - Jean-François Corbett
1
@Jean-FrançoisCorbett 您是正确的,我添加了URL。谢谢。 - JohnJohnGa
3
当表达式像这样单独出现时,编译器可以为您进行优化,以避免创建中间的字符串对象。(据我所知!) - Mark Rhodes
3
除非需要线程安全(这很怀疑),否则不要使用StringBuffer。自2004年起,Javadoc建议您改用StringBuilder。 - Peter Lawrey
显示剩余4条评论

2

1

在编程中,应该优先使用StringBuilder而不是字符串拼接,因为你会将方法调用和变量添加到字符串中。

然而,像"this "和"is"这样的简单字符串数量对性能没有影响,因为编译器会有效地处理它们并创建最终会出现在字节码中的内部字符串。也就是说,这些提到的字符串对最终性能没有任何额外开销。


1

我认为这样写字符串对性能没有任何影响 - 编译器会进行优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接