次のような Java の式があるとします。
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java のデフォルトの JDK コンパイラはどのような動作をしますか? 5 つの連結を行うだけですか、それともスマートなパフォーマンス トリックが実行されますか?
次のような Java の式があるとします。
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java のデフォルトの JDK コンパイラはどのような動作をしますか? 5 つの連結を行うだけですか、それともスマートなパフォーマンス トリックが実行されますか?
以下と同等のものを生成します。
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();