StringBuilder vs String concatenation in toString() in Java

给定以下 2 种实现,哪一种是首选:toString()

public String toString(){
    return "{a:"+ a + ", b:" + b + ", c: " + c +"}";
}

public String toString(){
    StringBuilder sb = new StringBuilder(100);
    return sb.append("{a:").append(a)
          .append(", b:").append(b)
          .append(", c:").append(c)
          .append("}")
          .toString();
}

?

更重要的是,鉴于我们只有3个属性,它可能不会有什么不同,但是在什么时候你会从concat切换到?+StringBuilder


答案 1

版本1是可取的,因为它更短,编译器实际上会把它变成版本2 - 没有任何性能差异。

更重要的是,鉴于我们只有3个属性,它可能不会有什么不同,但是在什么时候你会从concat切换到builder?

在循环中连接时 - 这通常是编译器无法自行替换的时候。StringBuilder


答案 2

关键是你是在一个地方编写单个串联,还是随着时间的推移积累它。

对于您给出的示例,显式使用StringBuilder是没有意义的。(查看第一个案例的已编译代码。

但是,如果您正在构建一个字符串,例如在循环中,请使用StringBuilder。

为了澄清,假设 hugeArray 包含数千个字符串,代码如下所示:

...
String result = "";
for (String s : hugeArray) {
    result = result + s;
}

与以下各项相比,非常浪费时间和内存:

...
StringBuilder sb = new StringBuilder();
for (String s : hugeArray) {
    sb.append(s);
}
String result = sb.toString();