Java 无法确定最有效的字符串连接

Java 无法确定最有效的字符串连接,java,tostring,Java,Tostring,我使用toString方法。但我不知道哪种实现更适合使用,为什么: public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("Description: " + description + ";"); buffer.append("Price: " + price); return buffer.toString(); } public String t

我使用toString方法。但我不知道哪种实现更适合使用,为什么:

public String toString() {
    StringBuffer buffer = new StringBuffer();
    buffer.append("Description: " + description + ";");
    buffer.append("Price: " + price);
    return buffer.toString();
}


public String toString() {
    return "Description: " + description + ";" + "Price: " + price;
}
两者都是完全相同的*,带有“+”运算符的串联有效地扩展为第一个示例中给出的StringBuffer构造

编辑:实际上它是一个StringBuilder,而不是Java5中的StringBuffer。唯一的区别是后者是线程安全的,可以由多个线程访问,而无需额外锁定。尽管如此,只要确定对象未在不同线程之间共享,就应该使用StringBuilder来避免同步开销

*不完全是这样,如果在append方法中嵌套额外的连接,可能会创建不必要的临时字符串,正如Jon Skeet指出的那样。在代码中没有注意到这一点。我的错。

两者完全相同*,带有“+”运算符的串联有效地扩展到您作为第一个示例给出的StringBuffer构造中

编辑:实际上它是一个StringBuilder,而不是Java5中的StringBuffer。唯一的区别是后者是线程安全的,可以由多个线程访问,而无需额外锁定。尽管如此,只要确定对象未在不同线程之间共享,就应该使用StringBuilder来避免同步开销


*不完全是这样,如果在append方法中嵌套额外的连接,可能会创建不必要的临时字符串,正如Jon Skeet指出的那样。在代码中没有注意到这一点。我的缺点。

就我个人而言,我会使用后者——它更清晰,实际上更高效:

对于Java的现代版本,它将使用未同步的StringBuilder类型而不是StringBuffer 它不会为Price:+Price和Description:+Description+构造中间字符串;这是不必要的, 在Java 5+下,我希望后一种代码能够编译为:

public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("Description: ");
    builder.append(description);
    builder.append(";");
    builder.append("Price");
    builder.append(price);
    return builder.toString();
}
然而,重要的一点是第二种形式的清晰性——我当然发现它比第一种更容易阅读。有趣的一点是,在我检查过的编译版本中,有两个连续的调用要附加字符串常量。在国际海事组织,写下以下内容会稍微更有效,甚至更具可读性:

public String toString() {
    return "Description: " + description + ";Price: " + price;
}

就我个人而言,我会使用后者——它更清晰,实际上更有效:

对于Java的现代版本,它将使用未同步的StringBuilder类型而不是StringBuffer 它不会为Price:+Price和Description:+Description+构造中间字符串;这是不必要的, 在Java 5+下,我希望后一种代码能够编译为:

public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("Description: ");
    builder.append(description);
    builder.append(";");
    builder.append("Price");
    builder.append(price);
    return builder.toString();
}
然而,重要的一点是第二种形式的清晰性——我当然发现它比第一种更容易阅读。有趣的一点是,在我检查过的编译版本中,有两个连续的调用要附加字符串常量。在国际海事组织,写下以下内容会稍微更有效,甚至更具可读性:

public String toString() {
    return "Description: " + description + ";Price: " + price;
}

这只是个人的偏好,因为根据以下公式,这两个公式都是一样的:

编译器使用字符串缓冲区来实现二进制字符串 串联运算符+。例如,代码:

 x = "a" + 4 + "c"   is compiled to the equivalent of:

 x = new StringBuffer().append("a").append(4).append("c")
                       .toString()     

此外,我还将@Override放在您的方法之上。

这只是个人偏好,因为它都是根据以下公式编译的:

编译器使用字符串缓冲区来实现二进制字符串 串联运算符+。例如,代码:

 x = "a" + 4 + "c"   is compiled to the equivalent of:

 x = new StringBuffer().append("a").append(4).append("c")
                       .toString()     

另外,我将@Override放在您的方法之上。

一般来说,最好使用StringBuffer或StringBuilder。StringBuffer和StringBuilder的不同之处在于StringBuffer是同步的。在您的示例中,我推荐StringBuilder

StringBuilder将减少分配的频率,这可以在您经常执行此操作时提供显著的速度和内存管理改进

请阅读此处有关此主题的更多内容:


一般来说,最好使用StringBuffer或StringBuilder。StringBuffer和StringBuilder的不同之处在于StringBuffer是同步的。在您的示例中,我推荐StringBuilder

StringBuilder将减少分配的频率,这可以在您经常执行此操作时提供显著的速度和内存管理改进

请阅读此处有关此主题的更多内容:


不一样。StringBuffer更优化。较新版本的Java 5+实际上使用而不是+运算符进行字符串连接,以避免同步的开销。@madmik3您在这方面有一些资源吗?不一样。StringBuffer更优化。较新版本的Java 5+实际上使用而不是+运算符进行字符串连接,以避免同步的开销。@madmik3您在这方面有一些资源吗?