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

时间:2012-02-11 16:39:11

标签: java tostring

我使用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;
}

4 个答案:

答案 0 :(得分:7)

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

  • 对于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();
}

重要的一点是第二种形式的清晰度 - 但我发现它比第一种形式更容易阅读。一个有趣的观点是,在编译版本中有两个连续的调用追加字符串常量(我已经检查过)。这将是略微更有效 - 甚至更可读,IMO - 写:

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

答案 1 :(得分:3)

两者完全相同 *,与'+'运算符的连接有效地扩展为您作为第一个示例提供的StringBuffer构造。

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

(*)嗯,不完全是,如果在append方法中嵌套其他连接,可能会创建不必要的临时字符串,就像Jon Skeet指出的那样。在你的代码中没有注意到。我的坏。

答案 2 :(得分:0)

这只是个人偏好,因为它根据 documentation 编译相同:

  

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

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

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

另外,我将@Override置于你的方法之上。

答案 3 :(得分:0)

通常,最好使用StringBuffer或StringBuilder。 StringBuffer和StringBuilder之间的不同之处在于StringBuffer是同步的。在您的示例中,我建议使用StringBuilder。

StringBuilder的分配频率会降低,当您执行此操作时,这可以提供显着的速度和内存管理改进。

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

Why to use StringBuffer in Java instead of the string concatenation operator