本文正在参加「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?
高分回答:
版本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
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️