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是更可取的,因为它更短,编译器实际上将其转换为版本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的答案中获取),并再次忽略性能。

链接地址: http://www.djcxy.com/p/24855.html

上一篇: StringBuilder vs String concatenation in toString() in Java

下一篇: How to concatenate a std::string and an int?