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连接都很好,更具可读性。
无论如何,这部分应用程序不太可能成为性能瓶颈。