假设我在Java中有一个表达式,例如:
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java的默认JDK编译器的行为是什么?它只是制作五个连接还是有一个聪明的演奏技巧?
答案 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();