Java StringBuilder.append的链是否比字符串连接更有效?

Java StringBuilder.append的链是否比字符串连接更有效?,java,Java,根据名为的Netbeans提示,使用.append方法链而不是字符串连接 在调用StringBuilder或StringBuffer的append方法的参数中查找字符串连接 StringBuilder.append()真的比字符串串联更有效吗 代码示例 StringBuilder sb = new StringBuilder(); sb.append(filename + "/"); vs 如果您使用大量的串联和非常长的字符串,则效率更高。对于一般用途,例如在示例中创建文件名,任何字符串串联都

根据名为的Netbeans提示,使用.append方法链而不是字符串连接

在调用StringBuilder或StringBuffer的append方法的参数中查找字符串连接

StringBuilder.append()真的比字符串串联更有效吗

代码示例

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


如果您使用大量的串联和非常长的字符串,则效率更高。对于一般用途,例如在示例中创建文件名,任何字符串串联都很好,可读性更高


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

好吧,编译器基本上将您的第一个示例转换为以下内容:

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

因此,是的,这里存在一定的低效率。然而,它在你的课程中是否真的重要是另一个问题。除了有问题的风格(提示:主观),它通常只在你在一个紧密的循环中进行时才起作用。

理论上,是的。因为字符串对象是不可变的:一旦构建,它们就不能再被更改。所以使用“+”(串联)基本上每次都会创建一个新对象

实际上没有。编译器足够聪明,可以用StringBuilder的附件替换所有的“+”

有关更详细的说明:


附:Netbeans???来吧

使用此函数,两个字符串的concat速度更快


但是,如果有多个字符串或不同的数据类型,则应显式或隐式使用StringBuilder。将
+
与字符串一起使用就是隐式地使用StringBuilder。

您必须平衡可读性和功能性

假设你有以下几点:

String str = "foo";
str += "bar";
if(baz) str += "baz";
这将创建2个字符串生成器(实际上只需要1个)以及一个额外的字符串对象。如果你去,你会更有效率:

StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();
但就风格而言,我认为第一个看起来不错。对我来说,创建单个对象的性能好处似乎微乎其微。现在,如果不是3个字符串,而是10个、20个或100个字符串,我会说性能超过了风格。如果它在一个循环中,我当然会使用字符串生成器,但我认为只要几个字符串就可以用“草率”的方式使代码看起来更干净。但是这里面潜伏着一个非常危险的陷阱!阅读下面的内容(暂停以建立悬念…邓邓邓恩)

有人说要始终使用显式字符串生成器。一个基本原理是,您的代码将继续增长,并且通常会以与现有代码相同的方式增长(即,它们不会花时间进行重构)。因此,您最终会得到10或20条语句,每个语句都会在不需要时创建自己的构建器。因此,为了从一开始就防止这种情况,他们说总是使用显式生成器

因此,在您的示例中,速度不会特别快,当将来有人决定在末尾使用文件扩展名或类似的内容时,如果他们继续使用字符串连接而不是StringBuilder,他们最终会遇到性能问题

我们还需要考虑未来。假设您在JDK 1.1中编写Java代码,并采用以下方法:

public String concat(String s1, String s2, String s3) {
    return s1 + s2 + s3;
}
在那个时候,它会很慢,因为StringBuilder不存在

然后,在JDK1.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();
}
它变得快多了。太棒了

现在JDK1.5问世了,随之而来的是StringBuilder(比StringBuffer快)和

return s1 + s2 + s3;


但是,由于显式地使用了StringBuffer,所以无法获得这种性能优势。因此,通过智能化,当Java变得比您更智能时,您已经导致了性能的下降。因此,你必须记住,有些事情是你不会想到的。

到目前为止,没有一个答案能明确说明提示所针对的具体情况。这并不是说总是使用
StringBuilder#append
而不是串联。但是,如果您已经在使用一个
StringBuilder
,那么混用串联是没有意义的,因为它会创建一个冗余的
StringBuilder
(请参阅)和一个不必要的临时
String
实例


几个答案已经讨论了为什么建议的方法更有效,但要点是,如果您已经有一个
StringBuilder
实例,只需调用
append
。它同样可读(在我看来,显然是编写NetBeans提示的人),因为您正在调用
append
,而且它的效率更高。

看看这篇有趣的文章:@Zaki:这些基准在实际应用中并不是那么有用。更有用的是分析应用程序,看看它是否真的存在性能瓶颈。并为您的特定用例选择合适的算法和数据结构。
加油?那么你会推荐什么呢?你的第二句话意味着它们都放在一个StringBuilder中。这是不准确的。如果您有
字符串s=“a”+“b”;s+=“c”你有2个字符串生成器,而不是1个。我推荐IntelliJ。从2003年到1012年一直与eclipse合作,然后切换。性能大幅提升。话题:这几天真的很有趣。这里也一样。我是Eclipse的忠实粉丝,直到我因为同事们不断的唠叨而尝试IntelliJ“只有几天”。我从不回头看。@corsiKa:我的循环运行了16次,这就是我在循环中所做的-str+=som_值。我的是jdk1.6。所以我是否应该使用StringBuilder。@Ashwin我个人会在那里使用StringBuilder。有必要吗?我想这取决于循环运行的频率。如果您正在构建一个散列的输出,那么您可以期望经常这样做。一定要加快速度
return s1 + s2 + s3;
return new StringBuilder().append(s1).append(s2).append(s3).toString();