文字列のStringBufferとStringBuilderのですか?文字列がなぜ不変である違いは何ですか?

変動


簡単に言えば:文字列を保持するために、文字列のキーワード最後の修正を使用して、Stringクラス、民間最終char値[]、Stringオブジェクトは不変ですので。StringBuilderとStringBufferのはAbstractStringBuilderクラスから継承されるが、2つのオブジェクトが可変であるように、また、値[]にAbstractStringBuilderに格納された最終的なキーワードで修飾されていない文字の文字列配列を使用しています。


StringBuilderとStringBufferのコンストラクタは、親クラスのコンストラクタが達成AbstractStringBuilderで呼び出している、我々はソースコード自体を見直すことができます。


AbstractStringBuilder.java


抽象クラスAbstractStringBuilderは追加可能、のCharSequenceを実装して{

    []の値をchar型。

    int型カウント;

    AbstractStringBuilder(){

    }

    AbstractStringBuilder(INT容量){

        値=新しいCHAR [容量]。

    }

スレッドの安全性


Stringオブジェクトは、それが安全定数スレッドとして理解することができ、不変です。AbstractStringBuilderのStringBuilderとStringBufferのは、共通の親クラスは、このようなexpandCapacity、追加、挿入、のindexOf他のパブリックメソッドとして文字列のいくつかの基本的な操作を定義しています。StringBufferのメソッドは、ジェンロックまたはメソッド呼び出しは同期ロックを追加して追加し、そのスレッドセーフです。StringBuilderの無メソッドプラスゲンロックは、そのスレッドセーフではありません。


演奏


たびにString型の変化は、新しいStringオブジェクト、新しいStringオブジェクトへのその後のポインタを生成します。StringBufferのStringBufferオブジェクト自体の代わりに、新しいオブジェクトを生成するので、動作し、オブジェクト参照を変更するたびに。使用のStringBuilder StringBufferを、同じ状況下で、約10%〜15%のパフォーマンス向上を取得するだけで使用する場合に比べ、彼らは危険なマルチスレッドのリスクを負います。


3本の要約の使用のために:


少量のデータを操作する:文字列について

操作シングルスレッド動作列バッファ大量のデータ:StringBuilderのための

データのマルチスレッド動作の文字列バッファを大量に操作する:該当するStringBuffer

ます。https://www.jianshu.com/p/f5cebb18437bで再現

おすすめ

転載: blog.csdn.net/weixin_34288121/article/details/91310525