Javaでの文字列スプライシング



String Splicing Java



Javaでは、Stringオブジェクトは不変(Immutable)です。複数のStringオブジェクトのエイリアスを作成できますが、これらのエイリアスへの参照は同じです。

ストリングステッチの詳細な分析

文字列は不変であるため、複数の文字列がスプライスされる場合、スプライスプロセス中に余分な文字列オブジェクトが生成されると想定するのが自然です。



String a = 'aaa' String b = 'bbb' String c = 'ccc' String info = a + b + c

当然、文字列の連結プロセス中に余分な文字列オブジェクトが生成されると思います。aaabbbスプライスされた文字列の数が十分である場合、冗長な文字列オブジェクトが多く生成されないため、パフォーマンスに深刻な影響を及ぼします。 ?

しかし、そうではありません。



コンパイラの最適化

実際、Javaコードがバイトコードにコンパイルされると、jvmは文字列のスプライシングを最適化し、StringBuilderになります。次に、スプ​​ライシングはStringBuilderのappendメソッドを直接呼び出します。

この場合、コンパイラが最適化を行っているため、文字列の連結に再度注意を払う必要があるようですが、そうではありません。
状況を見てみましょう

public void implicitUseStringBuilder(String[] values) { String result = '' for (int i = 0 i

ループでは、文字列がスプライスされます。このとき、jvmはStringBuilderも作成しますが、ループプロセスが終了した後、次のプロセスに入るときに新しいStringBuilderが作成されます。これにより、多くの冗長なStringBuilderオブジェクトが作成され、パフォーマンスに影響します。だから、ああ、まだ良いコーディング習慣があります:



public void explicitUseStringBuider(String[] values) { StringBuilder result = new StringBuilder() for (int i = 0 i