协慌网

登录 贡献 社区

StringBuilder vs Java 中 toString()的字符串连接

鉴于下面的 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 更可取,因为它更短, 编译器实际上将其转换为版本 2 - 无论如何都没有性能差异。

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

在循环中连接的时候 - 通常是编译器不能StringBuilder替换StringBuilder的时候。

关键是你是在一个地方写一个连接还是随着时间累积它。

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

我更喜欢:

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

... 因为它简短易读。

除非你在具有非常高重复次数的循环中使用它测量了性能差异,否则我不会对速度进行优化。

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