什么时候应该显式使用 StringBuilder?

2022-09-02 03:16:25

据我所知,当我这样做时,Java编译器会在内部将表达式替换为.然而,我们的Java老师告诉我们,最好总是使用显式...String baz = "foo" + "bar" + "123"StringBuilderStringBuilder

我假设我只需要在连接内部循环时显式使用StringBuilder,如堆栈溢出问题字符串生成器与字符串串联的答案中所示,我是否正确?在其他情况下,是否应显式使用 a 而不是 或 ?StringBuilder++=


答案 1

它比“内部循环”更通用 - 任何时候你都想对多个语句进行串联,并且不需要中间结果作为字符串。例如:

StringBuilder builder = new StringBuilder("Start");
if (someCondition) {
    builder.append("Foo");
}
if (someOtherCondition) {
    builder.append("Bar");
}
builder.append("End");
String result = builder.toString();

虽然你可以把它写成:

String result = "Start" + (someCondition ? "Foo" : "")
    + (someOtherCondition ? "Bar" : "") + "End";

...这变得难以阅读。如果机构内有更多的声明,甚至可能不可行。if

要更正问题中的某些内容::

据我所知,当我执行String baz = “foo”+“bar”+“123”时,java编译器会在内部用StringBuilder替换表达式。

否,当您编写该表达式时,编译器会识别出它是一个编译时常量,并将其替换为

String baz = "foobar123";

这是一个很好的理由,不要明确使用a - 上面的代码在执行时显然比更有效StringBuilder

String baz = new StringBuilder("foo").append("bar").append("123").toString();

它不是编译时常量时,Java 编译器将使用 执行串联,通常会给您留下比显式使用 更易于理解的代码,但不会降低性能。我怀疑你的老师要么没有正确理解字符串串联,要么只是在没有完全理解何时合适的情况下阅读你应该使用的地方。StringBuilderStringBuilderStringBuilder


答案 2

欧比旺说过,只有西斯才会以绝对或类似的方式思考......

很高兴您知道Java编译器在内部将字符串上的“+”替换为.这就是编译器的目的:让生活更轻松。StringBuilder

除非你有循环,如链接大小写,或者Jon Skeet的例子中的条件,否则这主要是可读性和维护的难易程度的问题。

取代

return "User " + userName + " said";

new StringBuilder().append("User ").append(userName).append(" said").toString();

使代码更长,可能更难修改,更有可能强制换行,并为您提供更高的性能。

但是,当加法不仅适用于字符串,而且涉及数字时,可能有时可能更具可读性的解决方案。StringBuilder

return "User" + a + b + " said: " + (c + d);

可能更令人困惑的是:

return new StringBuilder().append("User ").append(a).append(b)
  .append(" said: ").append(c+d).toString();  

但这主要是意见和编码风格的问题。“应该”在这里不是一个好词。