鉴于下面的 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 的答案)并再次忽略性能。