JavaでString,StringBuffer,StringBuilderの違い
1679 ワード
Stringクラスは、作成後に変更されない文字列を表すために使用されます.これはimmutableです.
StringBufferクラスは、コンテンツが可変な文字列を表すために使用され、下位文字列を変更する方法を提供します.文字列バッファは、複数のスレッドに安全に使用できます.これらのメソッドは、必要に応じて同期することができるため、任意の特定のインスタンス上のすべての操作は、関連する各スレッドによるメソッド呼び出し順序と一致するシリアル順序で行われるようになります.文字の結合を行う場合は、StringクラスではなくStringBufferクラスを使用します.前者は後者より100倍速いからです.
StringBuilderクラスは、文字列バッファが単一スレッドで使用される場合に使用される
例:
StringBufferクラスを使用する場合、コードは次のとおりです.
表面的にはStringクラスはプラス記号(+)だけで文字列の接合が完了しますが、StringBufferクラスはappend()メソッドを呼び出すので、より簡潔で単純に実現できますか?実はそうではありません.プログラムの実行内部でどのようなことが起こったのかを理解してみましょう.コンパイルされたプログラムのbytecode(バイトコード)は実質を示しています.Stringクラスオブジェクトで直接接続すると、JVMは一時的なStringBufferクラスオブジェクトを作成し、append()メソッドを呼び出して文字列の接続を完了します.これはStringクラスが可変ではないためです.接続操作はStringBufferクラスを使用しなければなりません(そして--JVMは「You are nice.」「I love you so much.」2つの新しいStringオブジェクトとして作成されます).その後、この一時的なStringBufferオブジェクトをStringに変換すると、コストがかかります.この単純な接合の過程で、プログラムに4つのオブジェクトを作成させました.2つの接合されるString、1つの一時StringBuffer、および最後にStringBufferをStringに変換しました.もちろん、最初のstrではありません.この参照の名前は変わりませんが、新しいStringオブジェクトを指しています.StringBufferクラスを直接使用すると、最初のStringBufferとパッチワーク時のString(「I love you so much.」)の2つのオブジェクトしか生成されません.一時的なStringBufferクラスオブジェクトを作成し、Stringオブジェクトに変換する必要もありません.我々の文字列がいくつかのセグメントをループ接合する場合、Stringクラスで直接操作すると、システムオーバーヘッドがどれだけ増加し、不要な一時StringBufferオブジェクトがどれだけ生成され、無駄な強制タイプ変換が何回処理されるか想像できます.
StringBufferクラスは、コンテンツが可変な文字列を表すために使用され、下位文字列を変更する方法を提供します.文字列バッファは、複数のスレッドに安全に使用できます.これらのメソッドは、必要に応じて同期することができるため、任意の特定のインスタンス上のすべての操作は、関連する各スレッドによるメソッド呼び出し順序と一致するシリアル順序で行われるようになります.文字の結合を行う場合は、StringクラスではなくStringBufferクラスを使用します.前者は後者より100倍速いからです.
StringBuilderクラスは、文字列バッファが単一スレッドで使用される場合に使用される
StringBuffer
の簡易置換として設計されている(この場合は一般的である).可能であれば、ほとんどの実装ではStringBuffer
よりも速いため、クラスを優先的に採用することをお勧めします.例:
String str="You are nice.";
str+="I love you so much.";
StringBufferクラスを使用する場合、コードは次のとおりです.
StringBuffer str= new StringBuffer("You are nice.");
str.append("I love you so much.");
表面的にはStringクラスはプラス記号(+)だけで文字列の接合が完了しますが、StringBufferクラスはappend()メソッドを呼び出すので、より簡潔で単純に実現できますか?実はそうではありません.プログラムの実行内部でどのようなことが起こったのかを理解してみましょう.コンパイルされたプログラムのbytecode(バイトコード)は実質を示しています.Stringクラスオブジェクトで直接接続すると、JVMは一時的なStringBufferクラスオブジェクトを作成し、append()メソッドを呼び出して文字列の接続を完了します.これはStringクラスが可変ではないためです.接続操作はStringBufferクラスを使用しなければなりません(そして--JVMは「You are nice.」「I love you so much.」2つの新しいStringオブジェクトとして作成されます).その後、この一時的なStringBufferオブジェクトをStringに変換すると、コストがかかります.この単純な接合の過程で、プログラムに4つのオブジェクトを作成させました.2つの接合されるString、1つの一時StringBuffer、および最後にStringBufferをStringに変換しました.もちろん、最初のstrではありません.この参照の名前は変わりませんが、新しいStringオブジェクトを指しています.StringBufferクラスを直接使用すると、最初のStringBufferとパッチワーク時のString(「I love you so much.」)の2つのオブジェクトしか生成されません.一時的なStringBufferクラスオブジェクトを作成し、Stringオブジェクトに変換する必要もありません.我々の文字列がいくつかのセグメントをループ接合する場合、Stringクラスで直接操作すると、システムオーバーヘッドがどれだけ増加し、不要な一時StringBufferオブジェクトがどれだけ生成され、無駄な強制タイプ変換が何回処理されるか想像できます.