为什么使用追加()而不是+

为什么使用追加()而不是+

问题描述:

可能重复:
Why to use StringBuffer in Java instead of the string concatenation operator为什么使用追加()而不是+

什么优点或这样做

int a= 42 
StringBuffer sb = new StringBuffer(40); 
String s = sb.append("a = ").append(a).append("!").toString(); 
System.out.println(sb); 

结果的目的> A = 42 !

代替

int a= 42 
String s = "a = " + a + "!"; 
System.out.println(sb); 

在您的场景中,我不确定是否有差异b/c所有“+”都在一行上(我相信这只会创建一个字符串)。但是,一般来说,字符串是不可变的对象,并不是真正的操作,而是使用StringBuffers创建和丢弃的。因此,最终,如果使用StringBuffers(通常是StringBuilders),将会有更高效的代码。如果你谷歌“字符串与StringBuffer与StringBuilder”你可以找到许多文章详细说明统计。

+0

谢谢。我用google搜索了一篇文章,并且解释了很多。 – code511788465541441 2010-12-02 16:53:29

效率。 Java中的字符串连接无论如何都在后台使用StringBuilders,因此在某些情况下,您可以通过自己控制来提高效率。

只需运行10000次的代码并测量时间。这应该是显而易见的。 一些背景信息:字符串是不可变的,而StringBuilder不是。所以每次连接一个字符串时都必须复制一个数组。 PS:有时候编译器会优化一些东西,尽管如此。也许如果你让你的变量静态最终它将只是一个字符串在内部而不是串联。

首先,StringBuffer是同步的,所以你通常会使用StringBuilder。前段时间,+已被重新实现以使用StringBuilder。

其次,正如@Riggy所提到的,Java实际上确实会优化+,只要它们出现在单个表达式中。但如果你是做:

String s = ""; 
s += a; 
s += b; 
s += c; 
s += d; 

则有效代码将变为:

String s =""; 
s = new StringBuilder(s).append(a).toString(); 
s = new StringBuilder(s).append(b).toString(); 
s = new StringBuilder(s).append(c).toString(); 
s = new StringBuilder(s).append(d).toString(); 

这是最理想的,以 String s = new StringBuilder(s).append(a).append(b).append(c).append(d).toString();

由于编译器优化的,它可能会或可能不会进行任何在你的应用程序的差异您必须运行比较速度测试才能看到。

但是,在你迷恋性能之前,让程序正常工作。 “不成熟的优化是万恶之源。”