30

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

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

Java 的默认 JDK 编译器的行为是什么?它只是进行五个连接还是完成了一个聪明的性能技巧?

4

1 回答 1

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();
于 2009-08-18T21:17:09.707 回答