StringBuilder.append的链比string连接更有效吗?

根据Netbeans提示命名为使用.append方法的链而不是string连接

在StringBuilder或StringBuffer的append方法的调用的参数中查找string连接。

StringBuilder.append()真的比string连接更高效吗?

代码示例

StringBuilder sb = new StringBuilder(); sb.append(filename + "/"); 

 StringBuilder sb = new StringBuilder(); sb.append(filename).append("/"); 

你必须平衡可读性和function。

假设你有以下几点:

 String str = "foo"; str += "bar"; if(baz) str += "baz"; 

这将创build2个string构build器(在那里你只需要1个),加上一个额外的string对象的临时。 如果你去了,你会更有效率:

 StringBuilder strBuilder = new StringBuilder("foo"); strBuilder.append("bar"); if(baz) strBuilder.append("baz"); String str = strBuilder.toString(); 

但作为一个风格问题,我认为第一个看起来很好。 单个对象创build的性能好处对我来说似乎是非常小的。 现在,如果不是3个string,而是10个,20个或100个,我会说性能超过了风格。 如果是在一个循环中,肯定会使用string生成器,但是我认为只需要几个string就可以使代码看起来更干净。 但是……这里面潜伏着一个非常危险的陷阱! 阅读下面(暂停build立悬念…敦敦邓恩)

有些人说总是使用显式string生成器。 其中一个基本原理是你的代码将会继续增长,而且通常会以与已经相同的方式来完成(比如,他们不会花费时间来重构)。所以最终你会得到10或20条语句自己的build设者,当你不需要。 所以为了防止这一切,他们说,总是使用一个明确的build设者。

所以在你的例子中,不会特别快,当将来的某个人决定在最后需要一个文件扩展名或类似的东西时,如果他们继续使用string连接而不是StringBuilder,他们会最终遇到性能问题。

我们也需要考虑未来。 假设您在JDK 1.1中创build了Java代码,并且您有以下方法:

 public String concat(String s1, String s2, String s3) { return s1 + s2 + s3; } 

那个时候,因为StringBuilder不存在,所以会很慢。

然后在JDK 1.3中,您决定通过使用StringBuffer使其更快(StringBuilder仍然不存在)。 你做这个:

 public String concat(String s1, String s2, String s3) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); sb.append(s3); return sb.toString(); } 

它变得快得多。 真棒!

现在JDK 1.5出来了,它带有StringBuilder(比StringBuffer快)和自动转换

 return s1 + s2 + s3; 

 return new StringBuilder().append(s1).append(s2).append(s3).toString(); 

但是你没有得到这个性能好处,因为你明确地使用了StringBuffer。 所以,聪明的做法是,当Java比你聪明的时候,你已经造成了性能的下降。 所以你必须记住,有些事情你不会想到。

那么,你的第一个例子基本上被编译器翻译成了一些东西:

 StringBuilder sb = new StringBuilder(); sb.append(new StringBuilder().append(filename).append("/").toString()); 

所以是的,这里有一定的低效率。 但是,在你的程序中是否真的是一个不同的问题。 除了有问题的风格(暗示:主观)之外,如果你是在一个紧密的循环中这样做,它通常只是很重要的。

目前为止,没有一个答案明确地解决了提示的具体情况。 这并不是说总是使用StringBuilder#append来代替串联。 但是,如果您已经使用了StringBuilder ,那么混合拼接是没有意义的,因为它会创build一个冗余的StringBuilder (参见Dirk的答案 )和一个不必要的临时String实例。

几个答案已经讨论了为什么build议的方式更有效,但重点是,如果你已经有了一个StringBuilder实例,只需要调用append就可以了。 这是可读的(在我看来,显然是谁写的NetBeans提示),因为你打电话append ,而且更有效率。

理论上,是的。 因为String对象是不可变的:一旦构造它们就不能再被改变。 所以使用“+”(连接)基本上每次都会创build一个新的对象。

实际上没有。 编译器很聪明,可以用StringBuilder附录replace所有的“+”。

有关更详细的解释: http : //kaioa.com/node/59

PS:Netbeans? 来吧!

两个string的连接使用此函数更快。

但是,如果您有多个string或不同的数据types,则应该明确或隐式地使用StringBuilder。 使用+与string隐式使用StringBuilder。

如果你使用了大量的连接和很长的string,它才会更有效率。 对于一般用途,比如在你的例子中创build一个文件名,任何string连接都很好,更具可读性。

无论如何,这部分应用程序不太可能成为性能瓶颈。