Java toString() 方法 中,StringBuilder vs String连接

问题

下面的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 热门回答(799 赞)

版本1是更可取的,因为它更短,而且没有任何性能差异。

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

在循环中 - 通常是编译器不能自己替换 StringBuilder 时。


#2 热门回答(197 赞)

关键在于你是在一个地方编写一个单独的连接还是随着时间的推移累积它。

对于你给出的例子,明确使用 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();

#3 热门回答(64 赞)

我更喜欢:

String.format( "{a: %s, b: %s, c: %s}", a, b, c );

...因为它简短易读。

我想我不会优化这个速度,除非你在一个循环次数很多的循环内使用字符串拼接,并且比较了它们的性能差异。

我同意,如果你必须输出很多参数,这种形式可能会让人困惑(就像其中一条评论所说)。在这种情况下,我会切换到一个更易读的形式(可能使用 apache-commons 的1478​​46830-从matt的答案中获取),并再次忽略性能。