当前位置: 首页 > 知识库问答 >
问题:

何时应明确使用StringBuilder?[副本]

戎兴言
2023-03-14

据我所知,当我执行stringbaz=“foo”“bar”“123”时,Java编译器会在内部用StringBuilder替换表达式。然而,我们的Java老师告诉我们,总是显式地使用StringBuilder是一个很好的实践。。。

我的假设正确吗?我只需要在串联内部循环时显式使用StringBuilder,如堆栈溢出问题的答案“String builder vs String concatenation”中所示?在其他情况下,是否应该明确使用StringBuilder而不是=

共有3个答案

寿鸣
2023-03-14

它们还适用于用字符串实现C#的'out'关键字。实例

public int getInt(StringBuilder error)
{
    int retVal = 0;

    if (someErrorOccured)
        error.append("Couldn't get int because of...");
    else
        retVal = whatItsSupposedToBe;

    return retVal;
}
籍星汉
2023-03-14

欧比万说过,只有西斯认为绝对或类似的东西...

很好,您知道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();  

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

荆学民
2023-03-14

它比“内部循环”更为通用——可以在任何时候对多个语句进行串联,而不需要中间结果作为字符串。例如:

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";

这是一个非常好的理由,不要显式地使用StringBuilder-上面的代码在执行时显然比

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

当它不是编译时常量时,Java编译器将使用StringBuilder执行串联,通常会给您留下比显式使用StringBuilder更容易理解的代码,但没有性能影响。我怀疑你的老师要么没有正确理解字符串串联,要么只是在其他地方阅读你应该使用的StringBuilder,而没有完全理解什么时候是合适的。

 类似资料:
  • 问题内容: StringBuilder在Java中,通常最好使用a 进行字符串连接。总是这样吗? 我的意思是:创建对象,调用方法并最终已经很小,然后将现有字符串与+运算符连接成两个字符串的开销是小的,还是建议仅用于两个以上的字符串? 如果有这样的阈值,它取决于什么(也许是字符串长度,但以哪种方式)? 最后,你是否会以+级联的可读性和简洁性为代价,以较小的情况(例如两个,三个或四个字符串)的性能为代

  • 有人在指令中被监视。 在这种情况下,只有在apply存在时才触发watch。

  • 问题内容: 我试图显式地使用LambdaMetafactory.metafactory,我不明白为什么它只能与Runnable功能接口一起使用。例如,以下代码完成了预期的工作(打印“ hello world”): 当我尝试使用其他功能接口(例如供应商)时,就会出现问题。以下代码不起作用: 这两个代码段不应该以相似的方式工作吗,这是第二个代码段中的问题? 此外,以下应等效的代码也可以正常工作: 编辑

  • 问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的

  • 在下面的代码中。我在Intellij idea编译器中发现val a和val b默认为"val a: StringBuilder" 这两者的区别是什么?和

  • 我是Spring的新手。在@Bean方法中注入Bean的这两种方法有什么区别?我应该使用哪个,为什么? 而且