【问题标题】:Java string concatenation efficiency [duplicate]Java字符串连接效率[重复]
【发布时间】:2012-02-02 07:27:10
【问题描述】:

这很糟糕吗?

(想象它更大)

int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;

还是在 StringBuilder/StringBuffer 中更好?

【问题讨论】:

    标签: java string coding-style concatenation


    【解决方案1】:

    Java 编译器会将其转换为 StringBuilder 以提高重复字符串连接的性能。 http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#15.18.1.2

    当您在循环编译器中进行连接时,不能自行替换 StringBuilder,这时您应该考虑从连接到 StringBuilder。

    【讨论】:

    • 这个article怎么样?
    • "当您在循环中进行连接时,编译器不能自行替换 StringBuilder,这时您应该考虑从连接到 StringBuilder"
    • 当您在循环中连接时, 编译器无法自行替换 StringBuilder。这时候你应该考虑从串联切换使用 StringBuilder
    【解决方案2】:

    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】:

      不,没关系。如果您使用 Sun 的 Java 6 编译器,它实际上会使用 StringBuilder。

      阅读此article

      【讨论】:

        【解决方案4】:

        如果你使用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
        

        【讨论】:

          【解决方案5】:

          (想象它更大)...

          使用“+”运算符的字符串连接会创建许多临时的 对象并增加垃圾收集。使用 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);
          

          可关联:String concatenation: concat() vs "+" operator

          【讨论】:

          • 是的,但是只有当您在循环中连接而不是一次性构建字符串时才会出现这种情况?
          • 引用 your source 总是有帮助的。
          • @Jean-FrançoisCorbett 你是对的,我添加了网址。谢谢
          • 当它在这样的单个表达式中时,编译器可以为您优化它,因此它不会创建中间字符串对象。 (据我所知!)
          • 除非你需要线程安全(这是值得怀疑的),否则不要使用 StringBuffer,Javadoc 自 2004 年以来建议你使用 StringBuilder。
          【解决方案6】:

          Relatively new article with graph, 用“+”表示连接的规模非常可怕。正如另一个答案中提到的,StringBuilder 可能更具可读性。

          【讨论】:

            【解决方案7】:

            你应该更喜欢 StringBuilder 而不是字符串连接,因为你有方法调用和变量被添加到字符串。

            但是,像“this”和“is”这样的简单字符串的数量对性能没有影响,因为编译器会有效地处理它们并创建最终在字节码中的内部字符串。话虽如此,那些提到的字符串不会对最终性能产生任何开销。

            【讨论】:

              【解决方案8】:

              我认为这样编写字符串不会对性能产生任何影响 - 编译器无论如何都会对其进行优化。

              【讨论】:

                猜你喜欢
                • 2020-01-21
                • 2015-07-31
                • 1970-01-01
                • 2011-05-23
                • 1970-01-01
                • 1970-01-01
                • 2021-03-14
                • 2011-05-14
                • 2014-05-20
                相关资源
                最近更新 更多