30

次のような Java の式があるとします。

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

Java のデフォルトの JDK コンパイラはどのような動作をしますか? 5 つの連結を行うだけですか、それともスマートなパフォーマンス トリックが実行されますか?

4

1 に答える 1

40

以下と同等のものを生成します。

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

静的文字列を事前に連結するのに十分スマートです(つまり、"omn" + "blablabla". StringBuilder必要に応じて、「パフォーマンス トリック」の使用を呼び出すことができます。5 つの連結を実行して 4 つの不要な一時文字列を作成するよりも、明らかにパフォーマンスが向上します。また、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 に答える