String、StringBuffer、StringBuilderの違いを知っていますか

ストリング

公式説明: Stringクラスは不変のクラスです。つまり、Stringオブジェクトが作成されると、オブジェクトに含まれる文字のシーケンスは、オブジェクトが破棄されるまで変更できません。

つまり、a = "111"; a = "222"を文字列化すると、元のヒープ内のインスタンスオブジェクトを再度割り当てる代わりに、新しいオブジェクトが生成され、aが "222"を指すようになります。以前のインスタンスオブジェクト「111」はまだ存在しており、ガベージコレクションの実行を待機しています。

StringBuffer与StringBuilder

これら2つは基本的に似ており、可変文字列オブジェクトです。主な違いは、スレッドが安全かどうかです。

まとめ

最後に、新人チュートリアルの下の要約と関連コメントを引用します。

  • 文字列の長さは可変ではありませんが、StringBufferおよびStringBuilderは可変長です
  • StringBufferはスレッドセーフですが、StringBuilderスレッドは安全ではありません
  • StringBuilderは高速です
  • 基本的に文字列バッファに適用できるシナリオはありません。すべての場合に文字列ビルダーを使用することを選択する必要があります

また、スレッドセーフについては、このようなシーンに実際に遭遇したとしても、残念ながら99.99 ... 99%のケースが残っていると思います。stringbufferのスレッドセーフは、jvmがスローしないようにするためだけなので、stringbufferを選択する必要はありません。異常終了した場合でもスムーズに実行でき、正しいロジックや呼び出しシーケンスを保証するものではありません。ほとんどの場合、スレッドセーフ以上のものが必要ですが、ロックが必要です。

最後に、なぜstringbufferがあるのですか?それが本当に価値がない場合、なぜjdkがこのクラスを提供するのですか?答えは単純すぎます。最初は文字列ビルダーがなかったため、太陽に照らされた人々はどのような愚かな配慮を知らなかったのか、文字列バッファーをスレッドセーフにすることに決めました。そして約10年後、人々はついにこの決定がどれほど愚かであるかを意識しました。過去10年間、この愚かな決定はJavaの実行速度が遅いという噂に大きな影響を与えたため、jdk1.5が最終的に非スレッドセーフの文字列バッファ実装を提供することを決定し、stringbuilderと命名しました。ちなみに、javacはこのバージョンから始まったようです。プラス記号で接続されたすべての文字列操作は暗黙的にstringbuilderに書き直されます。つまり、jdk1.5以降、プラス記号で文字列を結合してもパフォーマンスが低下しません。 。

ループがない場合、Javaコンパイラは暗黙的にstringbuilderに置き換えるため、プラス記号を含む文字列を1行で結合してもパフォーマンスが低下することはありません
ただし、ループの場合、コンパイラは十分に賢い置換を実現できず、パフォーマンスが低下します。
したがって、ループで文字列を接合するときは、正直にstringbuilderを使用してください。

68件のオリジナル記事が公開されました 賞賛さ れた128件 8万回の閲覧

おすすめ

転載: blog.csdn.net/qq_39380155/article/details/105536476