Java中toString()中的StringBuilder vs String串联?推荐 | Java Debug 笔记

182 阅读3分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

“Java中toString()中的StringBuilder vs String串联?

鉴于以下两种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?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

版本1是更可取的,因为它更短,并且编译器实际上会将其转换为版本2-完全没有性能差异。

更重要的是,鉴于我们只有3个属性,这可能没有什么不同,但是您什么时候从concat切换到builder?

在您串联连接的那一刻-通常是编译器无法自行替换时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();

高分回答

在Java 9中,版本1应该更快,因为它可以转换为invokedynamic调用。可以在JEP-280中找到更多详细信息:

这个想法是用对java.lang.invoke.StringConcatFactory的简单invokedynamic调用来替换整个StringBuilder追加操作,该调用将接受需要连接的值。

文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/1…

作者建议:不使用需要循环拼接的时候,我们可以直接用 “ + ”

看了一下文档,的确

我们将利用:的能力invokedynamic:通过提供一种在初始调用期间重新引导一次调用目标的方法,它为延迟链接提供了便利。这种方法并不是什么新鲜事物,并且我们大量借鉴了可转换lambda表达式的当前代码。

这个想法是StringBuilder用简单的invokedynamic调用替换整个append舞,该调用java.lang.invoke.StringConcatFactory将接受需要连接的值。例如,

String m(String a, int b) {
  return a + "(" + b + ")";
}

目前已编译为:

java.lang.String m(java.lang.String, int);
       0: new           #2                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
       7: aload_1
       8: invokevirtual #4                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      11: ldc           #5                  // String (
      13: invokevirtual #4                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: iload_2
      17: invokevirtual #6                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      20: ldc           #7                  // String )
      22: invokevirtual #4                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      25: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      28: areturn

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️