编译器何时不会隐式使用StringBuffer/StringBuilder?

9
我听说编译器(或者是JVM?)会自动为某些字符串连接使用StringBuilder。那么什么时候需要显式声明呢?如果不需要考虑线程安全,就不需要用StringBuffer。
谢谢。

1
注意:不使用 StringBuilder 的一种情况是当字符串可以在编译时连接。在这种情况下,它只会生成一个单独的字符串(没有 StringBuilder)。 - Peter Lawrey
顺便说一句:如果您需要使用StringBuffer来实现线程安全,我认为您的设计存在问题。 :P - Peter Lawrey
1个回答

15
编译器会自动将它用于使用“+”进行的任何字符串连接。
如果您想在循环中连接字符串,通常会显式地使用它。例如:
StringBuilder builder = new StringBuilder();
for (String name : names)
{
    builder.append(name);
    builder.append(", ");
}
if (builder.length() > 0)
{
    builder.setLength(builder.length() - 2);
}
System.out.println("Names: " + builder);

另一种情况是你想在多个方法中构建一个字符串,或者可能会对构建的某些部分进行条件判断。基本上,如果你不是在单个语句中构建字符串(编译器可以帮助你),那么至少应该考虑使用StringBuilder


1
我认为值得一提的是,在这种情况下不会使用StringBuilderString str = ""; str += <something that isn't a compile-time constant> - Matt Ball
啊,那很有道理,谢谢!顺便说一下,我以为你是个C#的人;o) - Jon Onstott
1
@Jon:C# 绝对是我首选的语言 - 但我写过的专业代码中,Java 的比 C# 更多 :) - Jon Skeet
1
@Jon:抱歉,我意识到那个评论不够清晰。这个答案阐述了我的意思(读作:失败)。StringBuilder将被使用,但在我第一个评论中的连接操作中,它将生成等效于new StringBuilder().append("foo").append(<something that...>).toString();的字节码。啊,我也应该在那个评论中将str初始化为非空字符串。 - Matt Ball
@Matt:是的,没错。每次执行语句时,它都会使用一个新的StringBuilder实例。 - Jon Skeet
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接