当 Java 编译器在一行中看到许多字符串串联时会发生什么?

2022-09-01 11:59:42

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

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

Java 的默认 JDK 编译器的行为是什么?它只是做了五个串联还是做了一个聪明的性能技巧?


答案 1

它生成等效的:

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

它足够智能,可以预先连接静态字符串(即“omn”+“blablabla”)。如果你愿意,你可以称之为“性能技巧”的使用。对于性能来说,这绝对比执行五个串联导致四个不必要的临时字符串更好。此外,使用StringBuilder是Java 5的性能改进。在此之前,使用了StringBuffer。StringBuilder

编辑:如注释中指出的那样,静态字符串只有在连接开始时才会预先连接。否则会破坏操作顺序(尽管在这种情况下,我认为Sun可以证明这一点)。所以给定这个:

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

它将被编译如下:

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

答案 2