首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.append(string1 + string 2)与.append(string1).append(string2)

使用.append(string1 + string 2)与.append(string1).append(string2)
EN

Stack Overflow用户
提问于 2013-12-20 03:22:45
回答 4查看 299关注 0票数 2

我想知道是否有人可以给我一个答案,这些语句中的哪一个在使用StringBuilder object的java中执行得更好:

使用

代码语言:javascript
复制
.append(string1 + string 2) 

vs

代码语言:javascript
复制
.append(string1).append(string2)
EN

回答 4

Stack Overflow用户

发布于 2013-12-20 03:29:28

第二种选择几乎肯定会更好(假设有任何明显的性能差异)。当你写一些像这样的东西

代码语言:javascript
复制
string1 + string2

它在内部转换为

代码语言:javascript
复制
new StringBuilder(string1).append(string2).toString()

即创建一个新的StringBuilder来连接这些字符串。您的第二个变体绕过了这个问题,因为它直接附加到现有的StringBuilder中,避免了创建新的a。

票数 4
EN

Stack Overflow用户

发布于 2013-12-20 03:34:40

我们可以看看每个选项的字节码:

代码语言:javascript
复制
public class Concat {
    private static String s1 = "foo";
    private static String s2 = "bar";

    public static String good() {
        StringBuilder b = new StringBuilder();
        b.append(s1).append(s2);
        return b.toString();
    }

    public static String bad() {
        StringBuilder b = new StringBuilder();
        b.append(s1 + s2);
        return b.toString();
    }
}

$javap -c Concat.class

 public static java.lang.String good();
    Code:
       0: new           #2                  // class java/lang/StringBuilder
       3: dup           
       4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
       7: astore_0      
       8: aload_0       
       9: getstatic     #4                  // Field s1:Ljava/lang/String;
      12: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      15: getstatic     #6                  // Field s2:Ljava/lang/String;
      18: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: pop           
      22: aload_0       
      23: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      26: areturn       

  public static java.lang.String bad();
    Code:
       0: new           #2                  // class java/lang/StringBuilder
       3: dup           
       4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
       7: astore_0      
       8: aload_0       
       9: new           #2                  // class java/lang/StringBuilder
      12: dup           
      13: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
      16: getstatic     #4                  // Field s1:Ljava/lang/String;
      19: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      22: getstatic     #6                  // Field s2:Ljava/lang/String;
      25: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      31: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      34: pop           
      35: aload_0       
      36: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      39: areturn

您的第一个选择实际上是append(new StringBuilder().append(s1).append(s2).toString())

票数 1
EN

Stack Overflow用户

发布于 2013-12-20 03:58:47

第一种方法打字更快,在很多情况下也更容易阅读。

第二个可能会稍微好一些(根据Jeffrey的字节码和arshajii的解释)。

然而,这种字符串连接不太可能成为系统中的瓶颈!如果性能有问题,您需要分析。编译器则有所不同。而改进算法通常比这种微观优化的影响要大得多。

不要在必要的时候提前优化!真的!这太诱人了,太浪费时间了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20689999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档