假设我在 Java 中有一个表达式,例如:
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java 的默认 JDK 编译器的行为是什么?它只是进行五个连接还是完成了一个聪明的性能技巧?
假设我在 Java 中有一个表达式,例如:
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java 的默认 JDK 编译器的行为是什么?它只是进行五个连接还是完成了一个聪明的性能技巧?
它生成等价于:
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();