【问题标题】:append or + operator in StringBuffer?在 StringBuffer 中追加或 + 运算符?
【发布时间】:2010-08-06 07:13:56
【问题描述】:

在我的项目中有一些使用StringBuffer对象的代码sn-ps,一小部分如下

StringBuffer str = new StringBuffer();

str.append("new " + "String()");

所以我对 append 方法和 + 运算符的使用感到困惑。

即下面的代码可以写成

str.append("new ").append("String()");

那么上面的两行是一样的吗?(功能上是但是)或者它们有什么特殊的用法吗?即性能或可读性或???

谢谢。

【问题讨论】:

    标签: java string


    【解决方案1】:

    那种的情况下,使用第一种形式更有效——因为编译器会将其转换为:

    StringBuffer str = new StringBuffer();
    str.append("new String()");
    

    因为它连接常量。

    还有一些更一般的观点:

    • 如果这些表达式中的任何一个不是常量,则最好(在性能方面)对append 进行两次调用,以避免无缘无故地创建中间字符串
    • 如果您使用的是最新版本的 Java,通常首选StringBuilder
    • 如果您要立即附加一个字符串(并且在构造时知道它是什么),您可以将它传递给构造函数

    【讨论】:

    • 只是出于更多原因 - StringBuilder 是首选,因为它不同步(速度如此之快)。
    【解决方案2】:

    实际上,字节码编译器将使用StringBuffer 调用替换Java 程序中涉及非常量的所有字符串连接。那是

    int userCount = 2;
    System.out.println("You are the " + userCount + " user");
    

    将被改写为

    int userCount = 2;
    System.out.println(new StringBuffer().append("You are the ").append(userCount).append(" user").toString());
    

    这至少是在反编译使用 JDK 5 或 6 编译的 java 类文件时可以观察到的。请参阅 this post

    【讨论】:

      【解决方案3】:

      第二种形式在性能方面最有效,因为只有一个字符串对象被创建并附加到字符串缓冲区。 第一种形式创建三个字符串对象 1) 用于 "new" 2) 用于 "new String" 3) 用于 1) 和 2) 的连接结果。并且这第三个字符串对象被连接到字符串缓冲区。

      【讨论】:

        【解决方案4】:

        除非您使用并发系统,否则请使用 StringBuilder 而不是 StringBuffer。它更快但不是线程安全的:)

        它也共享相同的 API,因此它或多或少是一个直接的查找/替换-

        【讨论】:

        • 你没有理解我相信的问题。
        • 是的,我想我的回复可能有点草率。
        猜你喜欢
        • 2011-06-06
        • 2011-04-28
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多