StringBufferをとStringBuilderの上

StringBufferの和のStringBuilder

文字列は、私たちの最も人気のあるクラスがあり、我々は我々はすべての文字列Stringクラスは不変であることを知って、毎日使用している
、私たちは時々 、コードの準備で文字列の連結を使用する必要があり、一度に新しいモザイクを作成し、文字列オブジェクトは、効率が遅いではなく、メモリの浪費、重症の場合はOutOfMemoryErrorが、メモリのオーバーフローを表示されることがあります。
私たちは、ときに、これらの二つのクラス、彼らは文字列の文字列の連結を再利用することができ、文字列の連結の多数でJavaのStringBufferあるいはStringBuilderのを使用することをお勧めします、彼らは非常に似て達成するためのいくつかの場所ではそれほど大きなその内部AbstractStringBuilderクラスを継承します。
まず、我々は彼らのコンストラクタを見て

StringBufferの

ここに画像を挿入説明
ここに画像を挿入説明

StringBuilder

ここに画像を挿入説明
ここに画像を挿入説明

上記のデフォルトの容量から分かる転送元+16に基づいて、文字列の長さの価値がある場合には、16であります

私たちは、この方法Arrays.copyOf(ブール[]元、INT newLength)を見て、このメソッドは、配列の拡大を達成するために新しい配列に配列をコピーすることができ、System.arraycopyの(オブジェクトのsrcが、srcPosをint型、オブジェクトDEST、int型この方法は、別の配列に指定された配列の内容をコピーする方法destPos、int型の長さ)、この方法は、アレイの容量削減を達成することができ、我々は見てのアペンドStringBuilderクラスを取る()メソッドの実装
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明

私たちは、nullでない場合、配列の元の長さがあなたの元の文字列の長さが渡されますが、判決が渡されたときにヌル文字列がスプライスアウトされる場合は、最初の文字列の連結にはnullではないことがわかります彼は元の長さの拡張が行わ16:00となります超えた場合、つまり、+ LENカウント、文字列の長さに渡されたレコードをカウントし、一緒に追加された、膨張機構はArrays.copyOf()このメソッドを使用して1 + 2倍、拡大がありますこの方法の拡張のために空いている場所が多く存在するので、それはまたSystem.arraycopyのと呼ばれ()この方法
上記方法では、それらが配列の配列を再利用するために使用する膨張機構に見られるだけでなく、いくつかの問題を有することができます。

StringBuilderのスレッドの安全性の問題

複数のスレッドのアクセスのStringBuilderはスレッド安全性のために問題が発生し、非常に簡単である場合には、どのようにそれを行うには?
私たちは、そのソースコードを見てこの時間、それはStringBufferのを思いついたここに画像を挿入説明
同期方法は、そのほぼすべてのスレッドセーフなStringBufferクラスを保証することができ、同期スレッドセーフを確保するために大幅に追加しましたが、問題がある、のStringBufferのStringBuilderの速度が速くされていません

StringBuilderとStringBufferの違い

StringBuilder
  1. スレッドセーフ
  2. バージョン1.5
  3. 速いです
StringBufferの
  1. スレッドセーフ
  2. バージョン1.0
  3. 遅いです

これらは、偉大な神の導きを歓迎するStringBufferとStringBuilderのが私の理解です

おすすめ

転載: blog.csdn.net/weixin_45118251/article/details/90550007