何时在 Java 中使用 StringBuilder?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (9)
  • 关注 (0)
  • 查看 (91)

一般来说最好使用StringBuilder用于Java中的字符串连接。但总是这样的吗?

我的意思是:创建一个 StringBuilder 对象,调用 Append 方法,最后使用 toString 进行输出,和将现有字符串使用 + 运算符链接相比,建议使用哪个?

如果存在这样的阈值,它依赖于什么(可能是字符串长度,但以哪种方式)?

最后,您是否可以将该系统的可读性和易用性进行比较?

提问于
用户回答回答于

如果在循环中使用字符串连接,如下所示,

String s = "";
for (int i = 0; i < 100; i++) {
    s += ", " + i;
}

那么您应该使用StringBuilder(不是StringBuffer)而不是String,因为它更快,消耗的内存更少。

如果你有一份声明,

String s = "1, " + "2, " + "3, " + "4, " ...;

然后你可以用String,因为编译器将自动使用StringBuilder

用户回答回答于

Microsoft证书材料解决了同样的问题。在.NET世界中,StringBuilder对象的开销使得两个字符串对象的简单连接效率更高。

对于Java字符串,我会假设类似的答案。

用户回答回答于

字符串连接的问题是,它会导致字符串对象的复制以及所有相关成本。

StringBuilder不是线程安全的,因此比StringBuffer更快,而StringBuffer 以前是Java 5之前的首选。

根据经验,您不应该在循环中进行字符串连接,这导致经常被调用。我想只要不超过数百个,在这里使用一些连接不会伤害你,当然这取决于您的性能要求。

如果你是在做实时的事情,你应该非常小心。

用户回答回答于

两个字符链接最快,但是在其他情况下,StringBuilder 会是更好的选择。

用户回答回答于

+ 运算符内部使用public String concat(String str)。该方法复制两个字符串的字符,因此它具有内存要求,运行时复杂度与两个字符串的长度成正比。而StringBuilder的工作效率更高。

但是我读过这儿,在 Java 4以后版本的编译器上,它会将使用 + 操作程序的连接代码更改为StringBuilder 。

因此,这可能根本不是一个问题。(如果我在代码中依赖于这个语句,我会检查它!)

用户回答回答于

某些编译器可能不会用 StringBuilder 等效来替换任何字符串连接。

在依赖于编译器优化之前,一定要考虑源代码将使用哪些编译器。

用户回答回答于

通常情况下,请始终使用更易读的代码,如果性能有问题,则只需要重构。

在这个特定的例子中,最近的JDK实际上会在任何情况下将代码优化为StringBuilder版本。

如果你在循环中使用或在一些复杂的代码中使用导致不能很容易地优化,通常只需要手动执行它。

用户回答回答于

我宁愿使用StringBuilder类来构建/修饰字符串,因为它的使用更像是Builder模式。

public String decorateTheString(String orgStr){
            StringBuilder builder = new StringBuilder();
            builder.append(orgStr);
            builder.deleteCharAt(orgStr.length()-1);
            builder.insert(0,builder.hashCode());
            return builder.toString();
}

它可以用作帮助器/构建器来构建字符串,而不是字符串本身。

扫码关注云+社区

领取腾讯云代金券