当Java Compiler在一行中看到许多String连接时会发生什么?

时间:2009-08-18 21:15:01

标签: java performance string concatenation

假设我在Java中有一个表达式,例如:

String s = "abc" + methodReturningAString() + "ghi" + 
                anotherMethodReturningAString() + "omn" + "blablabla";

Java的默认JDK编译器的行为是什么?它只是制作五个连接还是有一个聪明的演奏技巧?

1 个答案:

答案 0 :(得分:40)

它生成相当于:

String s = new StringBuilder("abc")
           .append(methodReturningAString())
           .append("ghi")
           .append(anotherMethodReturningAString())
           .append("omn")
           .append("blablabla")
           .toString();

预先连接静态字符串(即"omn" + "blablabla"是足够聪明的。如果你愿意,你可以使用StringBuilder称为“表演技巧”。性能肯定比做五个连接更好,导致四个不必要的临时字符串。另外,使用StringBuilder是(我认为)Java 5中的性能改进;在此之前,使用了StringBuffer。

编辑:正如评论中所指出的,如果静态字符串位于连接的开头,则它们仅被预先连接。否则会破坏运营顺序(尽管在这种情况下我认为Sun可以证明这一点)。所以这个:

String s = "abc" + "def" + foo() + "uvw" + "xyz";

它会像这样编译:

String s = new StringBuilder("abcdef")
           .append(foo())
           .append("uvw")
           .append("xyz")
           .toString();