ソースから文字列、StringBufferのとStringBuuilderを理解します

1.String

(1)クラス定義


パブリック最終クラスStringは
    java.io.Serializableの、<文字列>匹敵する、のCharSequenceを実装します


最終的な文字列クラスは、読み取り専用文字とシリアルポートインターフェースの大きさを比較し、シリアライゼーションインタフェースを実装するクラスです。文字列と8つのその他の基本データ型は不変クラスのために一緒にクラスをラッパー。

(2)主な変数


民間最終char値[];

底部は、実質的に文字クラスchar型配列である、基本的な方法のいくつかは、文字列char配列コールの基本的な方法です。

(3)一次コンストラクタ

パブリック文字列(){
  this.value =「」.Valueの;
}

のデフォルト値列「」;

文字列定数プール(4)

起動時のJVMスペース文字列定数プールをロードします機能は同じであり、同じリテラル、文字列リテラル定数プール内に作成し、それを返しているではない場合のみ、リテラル、他の同じリテラル、JVMが存在する場合、このリテラルの参照が返され、参照。ヒープ上に新しいキーワードオブジェクトを用いて得られたが、文字列定数プールにロードされていない、インターン()メソッドを動的動作中に文字列定数プールに追加配置スタック列を可能にします。

(5)スプライシング文字列

+記号によって文字列の文字列の連結は、一般的に実装され、通常は二つの形態がある:

列A =「AB&」+「CD」は、


彼はABCDに直接コンパイルされた場合、この時点で、それはプラス記号を考慮し、コンパイル時にJVMが効率がStringBuilerかのStringBufferよりも遅くはありません背後にある複数の文字列を追加する場合でも、無用です。

A =文字列「AB&」、
文字列B =「CD」、
文字列C = A + B;

この場合、文字列一緒にシステムに新しいStringBuilerを最適化することにより、二回ヒープで行われる動作を追加し、もしいくつかのStringBuilerオブジェクト内の複数のスプライシングの結果は、効率は当然低くなりますが、それはちょうどStringBuiler追加の新しいターゲット、同じコード行にスプライシング操作を行えば、効率が遅いません。

2.StringBuilder

(1)クラス定義

のStringBuilder AbstractStringBuilder最終パブリッククラス延び 
      実装java.io.Serializableの、たCharSequenceを


実装AbstractStringBuilder追加可クラス要約は、たCharSequence

のStringBuilderは、最終的なカテゴリであるシリアライゼーションインターフェース、文字読み取り専用シリアルポート、読み取り専用親クラスがインターフェイス文字列と可変型であるスプライスインタフェースを実装する実装します。

(2)主な変数

プライベート最終char値[];

根底StringBuilderの基本的な実装と文字列が一致している

(3)プライマリコンストラクタ

公共のStringBuilder(){
  スーパー(16);
}

AbstractStringBuilder(INT容量){
  値=新しい新たなチャー[容量];
}

基底クラスのコンストラクタStringBuiler列アレイ16の容量である

(4)文字列連結

公共のStringBuilderの追記(文字列str){
    super.append(STR)。
    これを返します。
}


追記パブリック(文字列STR){AbstractStringBuilder
    IF(STR == NULL)
        ; appendNullを(戻り)
    INT LEN = str.length();
    ensureCapacityInternal(COUNT + LEN);
    str.getChars(0、LEN、値、COUNT);
    COUNT = LEN +;
    これを返す;
}

(minimumCapacity INT)プライベートボイドensureCapacityInternal {
    //オーバーフロー配慮コード
    IF(minimumCapacity - value.length> 0){
          値= Arrays.copyOf(値、
                newCapacity(minimumCapacity));
    }
}

内部チャーアレイは容量を超えた場合、動作モードをコピーすることによって拡張アレイが発生し、操作することによって達成されます。

(5)スレッドセーフ

  LEN = +カウント、上記のコードを解析し、2つのスレッドがこのメソッドにアクセスする場合ではないアトミック動作は、AbstractStringBuilderカウントが同じでないので、2つのスレッドが、基礎となるchar配列数の位置であります追加APPEND開始、最終的な結果は、確かに追記した後に実行されるスレッドは、データ上書きの前に行きますので、文字列の連結作業中のStringBuilderはスレッドセーフです。文字列のステッチがStringBuilerによって達成されているので、その文字列の文字のステッチはスレッドセーフではありません

3.StringBuffer

(1)クラス定義

公共finalクラスのStringBufferは
    AbstractStringBuilderが延び
    たjava.io.Serializable、のCharSequenceを実装します

StringBufferの親クラスが共通の親のStringBuilder AbstractStringBuilderとのインタフェースの読み取り専用文字列とスプライスインタフェースを実装して、クラスが変更可能なクラスです。

(2)主要変数
下地のStringBuilder StringBufferの基本的な実装と一致しています。

(3)コンストラクタ

StringBufferのコンストラクタとのStringBuilderは一貫しています。

(4)文字列連結


パブリック同期のStringBufferの追記(文字列str){
    toStringCache = NULL;
    super.append(STR)。
    これを返します。
}

 

StringBufferの文字列の連結は、主な違いによりメソッド本体であり、内部のStringBuilderと基本的に一致して同期ロックキー。

(5)セキュリティスレッド

  添加する方法ので、上記のコード解析から、キーワードを同期するので、文字列の連結操作がスレッドセーフです。

 

注意:正式なインタビューは、基本的な答えは3との間の差であるとき:文字列は、StringBufferのとStringBuilderのは不変クラス可変クラスです。低効率とスレッドセーフな、最高のStringBuilder効率の数の文字列の文字列の連結が、スレッドセーフ、StringBufferの効率の両方の元の間ではなく、スレッドセーフ。

おすすめ

転載: www.cnblogs.com/hxlr/p/11417615.html